题目描述
题目:
编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
题解思路
将相同字母的字符串组合输出,首先我们想到的就是统计每个字符串中每个字母出现频率来判断字符串是否相同
如果不想比较每个字母的出现次序,也可以对字符串进行排序后比较,这样可以避免自己麻烦的创造数组存储
核心思想就是比较字符串,其他就是注意哈希表输出的格式最后要转成List<List<String>>
正确代码
class groupAnagramsSolution {
// 排序后比较字符串是否相等并作为key
public List<List<String>> groupAnagrams1(String[] strs) {
HashMap<String, List<String>> hashMap = new HashMap<>();
for (String str : strs) {
// 将排序后的字符串作为key
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
// 如果已经存在该字符串就放入,不存在的话就新建一个list
List<String> list = hashMap.getOrDefault(key, new ArrayList<String>());
list.add(str);
hashMap.put(key, list);
}
return new ArrayList<List<String>>(hashMap.values());
}
// 统计每个字母出现的次数比较字符串是否相等,将每个字母和次数作为key
public List<List<String>> groupAnagrams2(String[] strs) {
HashMap<String, List<String>> hashMap = new HashMap<>();
for (String str : strs) {
int[] counts = new int[26];
int length = str.length();
for (int i = 0; i < length; i++) {
counts[str.charAt(i) - 'a']++;
}
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < 26; i++) {
if (counts[i] != 0) {
stringBuffer.append((char)('a' + 1));
stringBuffer.append(counts[i]);
}
}
String key = stringBuffer.toString();
List<String> list = hashMap.getOrDefault(key, new ArrayList<String>());
list.add(str);
hashMap.put(key, list);
}
return new ArrayList<List<String>>(hashMap.values());
}
}
总结
其实每个问题都有它最核心的问题,就像每次dc都找到转移方程一样,所以算法题最重要的就是核心思路
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见