LeetCode第49题:字母异位分组(中等)
- 题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
- 解法一:取出数组中的字符串,将字符串转换成字符数组,排序,对比,比较蠢的算法吧。。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> ans = new ArrayList<>();
int len = strs.length;
int ans2[] = new int[len];
for(int i=0;i<len;i++){
List<String> perans = new ArrayList<>();
while(i<len && ans2[i] != 0){
i++;
}
if(i==len) break;
perans.add(strs[i]);
ans2[i] = 1;
char[] s_arr = strs[i].toCharArray();
Arrays.sort(s_arr);
int len1 = strs[i].length();
for(int j=i+1;j<len;j++){
int len2 = strs[j].length();
if(len1 == len2){
char[] s_arr2 = strs[j].toCharArray();
Arrays.sort(s_arr2);
int k=0;
while(k<len1){
if(s_arr2[k]==s_arr[k]){
k++;
}else{
break;
}
}
if(k==len1){
perans.add(strs[j]);
ans2[j] = 1;
}
}
}
ans.add(perans);
}
return ans;
}
}
- 解法二:想法跟上一个类似,不过加入了HashMap后简便了很多
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> hash = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
char[] s_arr = strs[i].toCharArray();
Arrays.sort(s_arr);
String key = String.valueOf(s_arr);
if (hash.containsKey(key)) {
hash.get(key).add(strs[i]);
} else {
List<String> temp = new ArrayList<String>();
temp.add(strs[i]);
hash.put(key, temp);
}
}
return new ArrayList<List<String>>(hash.values());
}
作者:windliang
链接:https://leetcode-cn.com/problems/group-anagrams/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by--16/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 解法三:主要思想是一个正整数可以写成质数乘积的形式,且写法唯一。将字母映射成质数,那么乘积相等的字符串一定是异位。
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<Integer, List<String>> hash = new HashMap<>();
int[] prime = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103 };
for (int i = 0; i < strs.length; i++) {
int key = 1;
for (int j = 0; j < strs[i].length(); j++) {
key *= prime[strs[i].charAt(j) - 'a'];
}
if (hash.containsKey(key)) {
hash.get(key).add(strs[i]);
} else {
List<String> temp = new ArrayList<String>();
temp.add(strs[i]);
hash.put(key, temp);
}
}
return new ArrayList<List<String>>(hash.values());
}
作者:windliang
链接:https://leetcode-cn.com/problems/group-anagrams/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by--16/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 解法四:比较常用的一种方法,利用HashMap记录每个字母出现的次数
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> hash = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
int[] num = new int[26];
for (int j = 0; j < strs[i].length(); j++) {
num[strs[i].charAt(j) - 'a']++;
}
String key = "";
for (int j = 0; j < num.length; j++) {
key = key + num[j] + '#';
}
if (hash.containsKey(key)) {
hash.get(key).add(strs[i]);
} else {
List<String> temp = new ArrayList<String>();
temp.add(strs[i]);
hash.put(key, temp);
}
}
return new ArrayList<List<String>>(hash.values());
}
作者:windliang
链接:https://leetcode-cn.com/problems/group-anagrams/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by--16/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。