leetCode每日一题
面试题 10.02. 变位词组
编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams-lcci
解题思路:
要求把字母组成相同的字符串排在一起,可以使用Hash表,key-value的形式,key表示相同字母组成(a1e1t1),value表示字符串(ate,eat,tea)
所以第一步:先遍历所有的字符串,计算出字母次数即key,并存入hash表中
第二步,输入hash表中的values
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
int length = strs.length;
List<List<String>> List = new ArrayList<List<String>>();
if(length == 0){
return List;
}
Map<String,List<String>> map = new HashMap<>();
for(String str:strs){
int[] count = new int[26];
for(int l=0;l<str.length();l++){
count[str.charAt(l)-'a']++;
}
StringBuilder sb = new StringBuilder();
for(int i=0;i<26;i++){
if(count[i]!=0){
sb.append('a'+i);
sb.append(count[i]);
}
}
String key = sb.toString();
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
}
101 / 101 个通过测试用例
状态:通过
执行用时: 10 ms
内存消耗: 41.7 MB
对每个字符串先排序,再存入hash表中。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<List<String>>();
Map<String,List<String>> map = new HashMap<>();
for(String str:strs){
char[] arr = str.toCharArray();
Arrays.sort(arr);
String key = new String(arr);
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
}
101 / 101 个通过测试用例
状态:通过
执行用时: 7 ms
内存消耗: 41.5 MB