【leetcode】49. (Medium) Group Anagrams
阿新 • • 發佈:2018-11-10
解題思路:
這道題的意思就是提取一系列詞的詞幹。
我的思路是,首先將所有的按照詞的長度分成一個一個的組(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;
}
}
執行結果: