给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
自我解(类似暴力枚举 时间复杂度O(n*n))
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<List<String>>();
List<char[]> kchar = new ArrayList<char[]>();
for(int i = 0 ; i < strs.length ; i ++){
char[] base = strs[i].toCharArray();
Arrays.sort(base);
kchar.add(base);
}
List<Integer> l = new ArrayList<Integer>();
for(int i = 0 ; i < strs.length ; i ++){ //找到其中都存在哪些字符集
boolean flag = true;
for(int j = 0 ; j < l.size() ; j ++){
boolean flagt = Arrays.equals(kchar.get(l.get(j)),kchar.get(i));
if(flagt)
flag=false;
}
if(flag)
l.add(i);
}
for(int ii : l){ //相同字符集的存在一起
List<String> ll = new ArrayList<String>();
for(int i = 0 ; i < strs.length ; i ++){
boolean flagt = Arrays.equals(kchar.get(ii),kchar.get(i));
if(flagt)
ll.add(strs[i]);
}
result.add(ll);
}
return result;
}
}
官方解(时间复杂度为O())
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs.length == 0) return new ArrayList();
Map<String, List> ans = new HashMap<String, List>();
for (String s : strs) {
char[] ca = s.toCharArray(); //转化为数组
Arrays.sort(ca); //排序
String key = String.valueOf(ca); //合成为字符串
if (!ans.containsKey(key)) ans.put(key, new ArrayList()); //查看是否包含
ans.get(key).add(s); //插入
}
return new ArrayList(ans.values());
}
}