题目
给定一个字符串数组,将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词指字母相同,但排列不同的字符串。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
方法
本题解题思路都是用hashmap为存储,必须用String为key保存
排序法
首先将每个字符串排序,查询排序后的字符串是否存在map中
- 时间复杂度:O(nklogk),n为字符串个数,k为字符串的长度,排序需要nlogn
- 空间复杂度:O(nk)
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
for(String str:strs){
char[] c = str.toCharArray();
Arrays.sort(c);
String key = String.valueOf(c);
if(map.containsKey(key)){
map.get(key).add(str);
}else{
List<String> value = new ArrayList<>();
value.add(str);
map.put(key,value);
}
}
List<List<String>> result = new ArrayList<>();
for(List<String> value:map.values()){
result.add(value);
}
return result;
}
}
计数法
首先把每个字符串的所有字符存入对应数组下标,然后再拼成字符串
- 时间复杂度:O(n*k),n为字符串的个数,m为最长字符串的长度
- 空间复杂度:O(n(k+∣Σ∣)),其中 nn 是字符串的数量,k是字符串的最大长度,Σ是字符集即26
作者:LeetCode-Solution
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
for(String str:strs){
int[] ch = new int[26];
for(int i=0;i<str.length();i++){
ch[str.charAt(i)-'a'] ++;
}
StringBuffer strBuf = new StringBuffer();
for(int i=0;i<26;i++){
if(ch[i]!=0){
strBuf.append('a'+i);
strBuf.append(ch[i]);
}
}
String key = strBuf.toString();
List<String> value = map.getOrDefault(key,new ArrayList<>());
value.add(str);
map.put(key,value);
}
return new ArrayList<List<String>>(map.values());
}
}