Given an array of strings, group anagrams together.
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Note:
分析:
第一反应是每次从数组中取出新的字符串然后遍历已有的list,对比是否Anagram,如果是就add,否则新建list.然后就需要一个函数判断是否anagram,就看是否第二个字符串中的所有元素都可以在第一个字符串中找得到且两个字符串长度相同。这种方法的问题就是字符串中相同字母可能出现不止一次:"fed","fee“。f,e在fed中都有,但是fee中没有d。
看了讨论区在高票的答案:其实用hashmap保存按照字母序的字符串映射的anagram列表就可以了,然后直接对比字符串按照字母序排序的结果和这个字母序字符串。
注意:
1. 转成字母序字符串的方法
2. hashmap的contains Key()方法; values()方法返回值是Collections<T>,需要强转。
- All inputs will be in lowercase.
- The order of your output does not matter.
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<>();
if(strs==null ||strs.length==0)
return res;
HashMap<String,List<String>> map = new HashMap<String,List<String>>();
for(String s:strs){
char[] arr = s.toCharArray();
Arrays.sort(arr);
String str = String.valueOf(arr);
if(!map.containsKey(str)){
List<String> tmp = new ArrayList<String>();
tmp.add(s);
map.put(str,tmp);
}
else
map.get(str).add(s);
}
res = new ArrayList<>(map.values());//collections转成List
return res;
}