题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
解法
思路:
异位词中的字母都是一样的,所以能不能转换成顺序一样的字符串,转换之后,对应在HashMap中的索引值就一样(即key的值一样),那么就只需要在对应key的value值上加上一个集合,每次key值一样,就在value值后面加上对应的异位词字符串就可以了,对应的思路,可以有很多的解法
解法
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap <String,List<String>> hash = new HashMap<>();
for(String str: strs){
//获取每一个字符串的编码值
String code = codeOfString(str);
//如果HashMap中有这个code,就取出对应的value(即List),在后面加上当前的str
if(hash.containsKey(code)){
hash.get(code).add(str);
}else{
//没有这个code就在hash中新建对应的键和值
LinkedList <String> list = new LinkedList<>();
list.add(str);
hash.put(code,list);
}
}
//把hash 的值全部取出来(每个值都是一个集合)放在List中
List<List<String>> res = new ArrayList<>();
for(List<String>list : hash.values()){
res.add(list);
}
return res;
}
//给一个编码值,编码值相等的字符串,说明是字母异位,返回的code都是一样的
public String codeOfString(String a){
int buf[] = new int[26];
for(char c : a.toCharArray()){
buf[c-'a']+=1;
}
return Arrays.toString(buf);
}
}
//解法2、直接对字符串进行操作
public List<List<String>> groupAnagrams(String[] strs) {
HashMap <String,List<String>> hash = new HashMap<>();
for(String str : strs ){
char []chars = str.toCharArray();//转换为字符数组
Arrays.sort(chars); //对字符数组排序
String order = new String(chars);//转化为有序字符串
//如果HashMap中有这个code,就取出对应的value(即List),在后面加上当前的str
if(hash.containsKey(order)){
hash.get(order).add(str);
}else{
//没有这个code就在hash中新建对应的键和值
LinkedList <String> list = new LinkedList<>();
list.add(str);
hash.put(order,list);
}
}
return new ArrayList<List<String>>(hash.values());
}