给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入:["eat", "tea", "tan", "ate", "nat", "bat"]
, 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ]说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
可以利用Map,将排序后的字符串作为key
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> hashMap = new HashMap<>();
for (String str : strs) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
String key = new String(chars);
if (!hashMap.containsKey(key)) {
hashMap.put(key, new ArrayList<>());
}
hashMap.get(key).add(str);
}
return new ArrayList<>(hashMap.values());
}
}ew ArrayList<>(hashMap.values());
开始的写法,太慢太慢了
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> list = new ArrayList<>();
// 一个词一个词遍历
for (String str : strs) {
boolean flag = false;
for (List<String> li : list) {
if (isSame(li.get(0), str)) {
li.add(str);
flag = true;
break;
}
}
if (!flag) {
List<String> newArr = new ArrayList<>();
newArr.add(str);
list.add(newArr);
}
}
return list;
}
/**
* 判断两个字符串是否为异位字符串
* @param str
* @return
*/
public boolean isSame(String str1, String str2) {
// 长度不同,返回false
if (str1.length() != str2.length()) {
return false;
}
int[] arr1 = new int[26];
char[] chArr1 = str1.toCharArray();
for (char i : chArr1) {
arr1[i - 'a']++;
}
int[] arr2 = new int[26];
char[] chArr2 = str2.toCharArray();
for (char i : chArr2) {
arr2[i - 'a']++;
}
// 遍历判断
for (int i = 0; i < arr1.length; i++) {
// 存在不同字母,返回false
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
}