找出n個字符串中出現次數最多的字符串。

1. 找出n個字符串中出現次數最多的字符串。java

C/C++:算法

char* find(char **data,int n);數組

Java:函數

String find(String data[]);this

說明:blog

1. data是字符串數組,n是數組中字符串的個數,返回值爲出現次數最多的字符串。內存

2. 若結果有多個,返回任意一個便可字符串

3. 不得使用任何庫函數/API,如需使用相似功能, 請自行實現string

4. 算法效率儘量高,儘可能少的使用內存空間class

5. 必需要有代碼註釋和算法說明。

例如:data裏面的數據是{「paper」,」cup」,」book」,」cup」,」pen」,」book」}。n = 6。返回結果爲」cup」或」book」。

 

package offer;

/**
 * 解決問題:找出n個字符串中出現次數最多的字符串。 解決思路:經過對字典樹進行改造,在提升效率的同時,完成對出現最多自身的統計。
 * 
 * 
 * @author cxx
 *
 */
public class FindMaxCountWord {

	private TrieNode root = new TrieNode();// 字典樹的根節點
	private int max;// 統計出現的最大次數
	private String maxWord;// 出現最大次數的字符串

	protected class TrieNode {
		protected int words;// 統計從根到該節點的單詞出現的個數
		protected TrieNode[] edges;// 存放該節點的子節點

		TrieNode() {
			this.words = 0;
			edges = new TrieNode[26];// 題目對於字符沒有作出限制,這裏默認全是小寫字符
			for (int i = 0; i < edges.length; i++) {
				edges[i] = null;
			}
		}
	}

	// 向字典樹中添加單詞
	public void addWord(String word) {
		addWord(root, word, word);// 第二個word是個冗餘參數,爲了記錄增長的單詞
	}

	private void addWord(TrieNode vertex, String word, String wordcount) {
		if (word.length() == 0) {
			vertex.words++;
			if (max < vertex.words) {
				max = vertex.words;
				maxWord = wordcount;
			}
		} else {
			char c = word.charAt(0);
			c = Character.toLowerCase(c);
			int index = c - 'a';
			if (vertex.edges[index] == null) { // 構建節點的路徑
				vertex.edges[index] = new TrieNode();
			}
			addWord(vertex.edges[index], word.substring(1), wordcount); 
		}
	}

	// 返回出現次數最大的單詞
	public String maxCountWord() {
		return maxWord;
	}

	public static void main(String args[]) // Just used for test
	{
		FindMaxCountWord trie = new FindMaxCountWord();

		String[] data = { "paper", "ckup", "book", "cup", "pen", "book" };

		for (int i = 0; i < data.length; i++) {
			trie.addWord(data[i]);
		}

		System.out.println(trie.maxCountWord());

	}

}
相關文章
相關標籤/搜索