一、错误思路:在判断是否str[i]的每一个字母都存在于str[j]中
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List list = new ArrayList();
Map<Integer,Integer> map = new HashMap();
for(int i=0; i<strs.length; i++){
if (map.containsKey(i)){
continue;
}
List list_tmp = new ArrayList();
list_tmp.add(strs[i]);
for(int j=i+1; j<strs.length; j++){
if(strs[i].length() != strs[j].length()){
continue;
}
int k=0;
for(; k<strs[i].length(); k++){
char c = strs[i].charAt(k);
if (strs[j].indexOf(c) == -1){
break;
}
}
if (k==strs[i].length() || (strs[i].length()==0 && strs[j].length()==0)){
list_tmp.add(strs[j]);
map.put(j,0);
}
}
list.add(list_tmp);
}
return list;
}
}
注意:
- 数组的长度通过
length
计算,String的长度通过length()
计算 - 注意continue(结束本次循环)和break(结束此循环)的区别
- String中
charAt()
和indexOf()
函数的使用
错误原因:未考虑有相同字母但是数量不同的情况
二、正确解法:初始化一个哈希表 map,其中键是排序后的字符串,值是对应的异位词列表(ArrayList)。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for(String str:strs){
char[] tmp_chars = str.toCharArray();
Arrays.sort(tmp_chars);
String sort_str = new String(tmp_chars);
if (!map.containsKey(sort_str)){
map.put(sort_str,new ArrayList());
}
map.get(sort_str).add(str);
}
return new ArrayList<>(map.values());
}
}
注意:
- String转换为char数组:
char[] chars = str.toCharArray()
- char数组转换为String:
String str = new String(chars)
- char数组排序:用数组Arrays类实现
Arrays.sort(chars)
- 把未排序的string放入map的list中:
map.get(sort_str).add(str)