49. 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
思路:
我们不难发现每一组的单词字母是相同的,只是排列不同而已,那么我们如果将这些排列不同的单词,按字母顺序进行排序,则他们是一样的,如
排序前 排序后
ate aet
eat aet
tea aet
因此我们可以用一个HashMap<String,List<String>>
来完成分组,其中key
是单词按字母序排序后的形式,value
则是所有按字母序排序后是key
的单词的集合,由此即完成了分组的任务。
Java代码
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs == null || strs.length == 0) return new ArrayList<>();
Map<String,List<String>> map = new HashMap<>();
for(String str : strs){
//对str按字母序排序
char[] chs = str.toCharArray();
Arrays.sort(chs);
if(!map.containsKey(String.valueOf(chs))){
List<String> list = new ArrayList<>();
map.put(String.valueOf(chs),list);
}
map.get(String.valueOf(chs)).add(str);
}
return new ArrayList<>(map.values());
}
}
Go代码
func groupAnagrams(strs []string) [][]string {
//我们可以用一个map[string][]string来完成分组,其中key是单词按字母序排序后的形式,
//value则是所有按字母序排序后是key的单词的集合,由此即完成了分组的任务。
if len(strs) == 0 {
return [][]string{}
}
m := make(map[string][]string)
for i := 0;i < len(strs);i++ {
// sort只提供了对切片的排序,所以先转为字节切片,后面再转回字符串
temp := []byte(strs[i])
sort.Slice(temp,func(i,j int)bool {return temp[i] < temp[j]})
key:= string(temp)
if _,ok := m[key];ok {
m[key] = append(m[key],strs[i])
} else {
arr := make([]string,0)
arr = append(arr,strs[i])
m[key] = arr
}
}
res := make([][]string,0)
for _,val := range m {
res = append(res,val)
}
return res
}