编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
注意:本题相对原题稍作修改
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”], 输出: [
[“ate”,“eat”,“tea”], [“nat”,“tan”], [“bat”] ]
法一:排序+hash
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> ans=new ArrayList<>();
Map<String,List<String>> map=new HashMap<>();
for(String i:strs){
char[] as=i.toCharArray();
Arrays.sort(as);
String key=String.valueOf(as);
List<String> list=map.getOrDefault(key,new ArrayList<>() );
list.add(i);
map.put(key,list );
}
for(String key:map.keySet()){
ans.add(map.get(key));
}
return ans;
}
法二:模拟 + 计数
public List<List<String>> groupAnagrams(String[] ss) {
List<List<String>> ans = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for (String s : ss) {
int[] cnts = new int[26];
for (char c : s.toCharArray()) cnts[c - 'a']++;
StringBuilder sb = new StringBuilder();
for (int i : cnts) sb.append(i + "_");
String key = sb.toString();
List<String> list = map.getOrDefault(key, new ArrayList<>());
list.add(s);
map.put(key, list);
}
for (String key : map.keySet()) ans.add(map.get(key));
return ans;
}
法二使得时间复杂度可以做到线性,因为法一的循环内部使用了排序故复杂度不能为线性,虽说如此,法二用的时间要比法一更长