49. 字母异位词分组
题干
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1: 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2: 输入: strs = [""] 输出: [[""]]
示例 3: 输入: strs = ["a"] 输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
思路1:直接模拟过程
class Solution { public List<List<String>> groupAnagrams(String[] strs) { List<List<String>> res = new ArrayList<>(); Set<Integer> skipSet = new HashSet<>(); for(int i=0;i<strs.length;i++){ if(skipSet.contains(i)){ continue; } List<String> singleRes = new ArrayList<>(); singleRes.add(strs[i]); Map<Character,Integer> count = new HashMap<>(); for(int j=0;j<strs[i].length();j++){ char c = strs[i].charAt(j); count.put(c,count.getOrDefault(c,0)+1); } if(i+1<strs.length){ for(int j=i+1;j<strs.length;j++){ Map<Character,Integer> target = new HashMap<>(); for(int k=0; k<strs[j].length();k++){ char c = strs[j].charAt(k); target.put(c, target.getOrDefault(c,0)+1); } if(count.equals(target)){ singleRes.add(strs[j]); skipSet.add(j); } } } res.add(singleRes); } return res; } }
结果:
提交之后发现问题:
思路2:字符串提前排序
先把每个string内部按照a-z排序,然后再把排完序后的string来匹配就能够快些了
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
for(int i=0;i<strs.length;i++){
char[] chs = strs[i].toCharArray();
Arrays.sort(chs);
String key = String.valueOf(chs);
if(map.containsKey(key)){
List<String> list = map.get(key);
list.add(strs[i]);
map.put(key,list);
}
else{
List<String> list = new ArrayList<String>();
list.add(strs[i]);
map.put(key, list);
}
}
List<List<String>> res = new ArrayList<>();
for(Map.Entry<String, List<String>> entry:map.entrySet()){
List<String> singleList = entry.getValue();
res.add(singleList);
}
return res;
}
}