49. 字母异位词分组
题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
代码1:
import java.util.Arrays;
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
var list =new ArrayList<List<String>>();
var array=new ArrayList<String>();
array.add(strs[0]);
list.add(array);
for(int i=1;i<strs.length;i++){
boolean bl=false;
for(int j=0;j<list.size();j++){
if(match(list.get(j).get(0),strs[i])){
list.get(j).add(strs[i]);
bl=true;
break;
}
}
if(bl){continue;}
array=new ArrayList<String>();
array.add(strs[i]);
list.add(array);
}
return list;
}
//match方法比较串是否含有相同字符 先转换成数组(字符/字节),再对数组排序,再比较数组
public static boolean match(String arr,String str){
if(arr.length()!=str.length()){return false;}
byte[] b1=arr.getBytes();
byte[] b2=str.getBytes();
Arrays.sort(b1);
Arrays.sort(b2);
return Arrays.equals(b1,b2);
}
}

代码2:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String,ArrayList<String>> map=new HashMap<String,ArrayList<String>>();
for(String str:strs){
char[] ch= str.toCharArray();
Arrays.sort(ch);
String key=String.valueOf(ch);
if(!map.containsKey(key)){
map.put(key,new ArrayList<String>());
}
map.get(key).add(str);
}
return new ArrayList(map.values());
}
}
方法三:26个英文字母分别对应一个质数,求每个String的乘积,乘积相同就是异位词。