标签:group amp return tar 资料 lsp res string turn
难度 medium
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
解题思路:这道题我的思路和grandyang的很接近,总算很接近了,首先取一个单词,排序,因为异位词经过排序后是相同的,然后用unordered_map来建立映射,从string映射到int,这个int就是表示当前这个单词属于res的第几个分组.所以当遍历一个字符串时,首先判断它在hashmap中是否存在,如果不存在需要在res中增加一个分组,这里用了一个技巧,即这个分组的编号刚好是当前res的size,所以映射到这个size即可,然后再在res的新分组中把这个string(未排序前的)给push_back进去,当然还有一个地方需要注意,就是没有push_back之前,这个分组是不存在的,所以需要先push_back一个空vector进去才可以.详见line11.
代码t75 s65
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
unordered_map<string, int> m;
for (string str : strs) {
string t = str;
sort(t.begin(), t.end());
if (!m.count(t)) {
m[t] = res.size();
res.push_back({});
}
res[m[t]].push_back(str);
}
return res;
}
};
下面这个是java版本的,学会了怎么给java的String排序。
代码t96 s60 java
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, Integer> map = new HashMap<>();
List<List<String>> res = new ArrayList<>();
for(String s : strs){
String t1 = s;
char[] chars = s.toCharArray();
Arrays.sort(chars);
t1 = new String(chars);
if(!map.containsKey(t1)){
map.put(t1, res.size());
List<String> stringArray = new ArrayList<>();
stringArray.add(s);
res.add(stringArray);
}else{
List<String> stringArray = res.get(map.get(t1));
stringArray.add(s);
}
}
return res;
}
}
参考资料:
http://www.cnblogs.com/grandyang/p/4385822.html
https://www.tutorialspoint.com/how-to-sort-a-string-in-java-alphabetically-in-java
标签:group amp return tar 资料 lsp res string turn
原文地址:https://www.cnblogs.com/zhengxch/p/14754159.html