在刷双指针和滑动窗口的题,结果做到了一道贪心和一道哈希表 究竟是谁分类的哼
Given an array of strings strs, group the anagrams together. You can return the answer in any order.
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
Example 1:
Input: strs = ["eat","tea","tan","ate","nat","bat"]
Output: [["bat"],["nat","tan"],["ate","eat","tea"]]
Example 2:
Input: strs = [""]
Output: [[""]]
Example 3:
Input: strs = ["a"]
Output: [["a"]]
总结一下,就是把含有相同字母的string组合在一起。
我最开始的想法是把每一个字符串都排序,排序前的字符串是original,排序后的字符串是sorted,然后放在一个数据结构里:List<original, sorted>,之后讲list通过sorted字段进行排序,排序之后,从头到尾遍历,如果后面sorted字符串和前面的sorted字符串相同,则把两边的original字符串放在一起,最终得到结果
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<>();
List<String[]> list = new ArrayList<>();
for(int i = 0; i < strs.length; i++) {
String original = strs[i];
char[] chars = original.toCharArray();
Arrays.sort(chars);
String sorted = new String(chars);
list.add(new String[]{sorted, original});
}
Collections.sort(list, (a, b) -> a[0].compareTo(b[0]));
for(int i = 0; i < list.size(); i++) {
if (i > 0 && list.get(i)[0].equals(list.get(i-1)[0])) {
List<String> item = res.get(res.size() - 1);
item.add(list.get(i)[1]);
} else {
List<String> item = new ArrayList<>();
item.add(list.get(i)[1]);
res.add(item);
}
}
return res;
}
}
击败34.90%的选手
更好的解法就是用map来做,创建一个Map<String, List>,前面的string是sorted,后面就是放所有original的list,每遍历一个字符串,就通过sorted拿到对应的list然后把original加进去,这样效率会更高
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for(int i = 0; i < strs.length; i++) {
String original = strs[i];
char[] charArray = original.toCharArray();
Arrays.sort(charArray);
String sorted = new String(charArray);
List<String> sameList = map.getOrDefault(sorted, new ArrayList<>());
sameList.add(original);
map.put(sorted, sameList);
}
return new ArrayList<List<String>>(map.values());
}
}