1. 程式人生 > >【leetcode】49. (Medium) Group Anagrams

【leetcode】49. (Medium) Group Anagrams

題目連結


解題思路:
這道題的意思就是提取一系列詞的詞幹。
我的思路是,首先將所有的按照詞的長度分成一個一個的組(group),所有的組合並起來就是groups.
然後對for迴圈對每一個group進一步提取詞幹小組,子函式CreateGroup返回的是子結果(sub result),所有子結果的和加起來就是最後返回的結果

createGroup的原則是,首先計算出候選cand陣列(candidate)所有詞的詞表,就一個26位的陣列,陣列中的數字是單詞中字母出現的次數。以單詞為關鍵詞,這個字母的陣列為值存到map裡。
首先將cand中的第一個單詞新增到list,並將這個list新增到subres。然後對比剩下的單詞和subres中所有list的首個單詞的詞表,如果一樣就加進那個list
createGroup返回的是長度相同單詞裡組成所有的詞幹組。


提交程式碼:

class Solution {
	public List<List<String>> groupAnagrams(String[] strs) {
		int i, j;
		List<List<String>> groups = new ArrayList<List<String>>();
		// strs with the same length will be stored in group,and
		// all group will be saved in groups
		for (
i = 0; i < strs.length; i++) { for (j = 0; j < groups.size(); j++) { if (strs[i].length() == groups.get(j).get(0).length()) { groups.get(j).add(strs[i]); break; } } if (j == groups.size()) { List<String> group = new ArrayList<String>(); group.add(strs[
i]); groups.add(group); } } //print the groups //for (i = 0; i < groups.size(); i++) { //for (j = 0; j < groups.get(i).size(); j++) //System.out.print(groups.get(i).get(j) + " "); // System.out.println(); //} List<List<String>> res=new ArrayList<List<String>>(); for(i=0;i<groups.size();i++) { List<List<String>> subres=new ArrayList<List<String>>(); subres=createGroup(groups.get(i)); res.addAll(subres); } return res; } public List<List<String>> createGroup(List<String> cand) { List<List<String>> subres=new ArrayList<List<String>>(); int i,j; //create HashMap Map<String,int[]> map=new HashMap<String,int[]>(); for(i=0;i<cand.size();i++) { int cnt[]=new int[26]; for(j=0;j<cand.get(i).length();j++) cnt[(cand.get(i).charAt(j)-'a')]++; map.put(cand.get(i), cnt); } //show hashmap //for(i=0;i<cand.size();i++) { //for(j=0;j<26;j++) //System.out.print(map.get(cand.get(i))[j]); //System.out.println(); //} //add the first word into the subres List<String> list=new ArrayList<String>(); list.add(cand.get(0)); subres.add(list); for(i=1;i<cand.size();i++) { list=new ArrayList<String>(); //find duplicate for(j=0;j<subres.size();j++) { if(Arrays.equals(map.get(cand.get(i)), map.get(subres.get(j).get(0)))) { //if(map.get(cand.get(i))==map.get(subres.get(j).get(0))) { subres.get(j).add(cand.get(i)); break; } } if(j==subres.size()) { list.add(cand.get(i)); subres.add(list); } } return subres; } }

執行結果:
在這裡插入圖片描述