From : https://leetcode.com/problems/anagrams/
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
class Solution {
public:
vector<string> anagrams(vector<string>& strs) {
int size = strs.size(), index;
vector<string> res;
// value 非负, 表示该串未被匹配过
map<string, int> box;
string s;
for(int i=0; i<size; i++) {
s = strs[i];
sort(s.begin(), s.end());
if(box.find(s) == box.end()) {
box[s] = i;
} else {
if(box[s] >= 0) {
res.push_back(strs[box[s]]);
box[s] = -1;
}
res.push_back(strs[i]);
}
}
return res;
}
};
题目后来做了更新,下面是更新的解答。
public class Solution {
private long[] bs = new long[26];
public List<List<String>> groupAnagrams(String[] strs) {
init(strs);
Map<Long, List<String>> map = new HashMap<Long, List<String>>();
for(String str : strs) {
Long h = hash(str);
if(! map.containsKey(h)) {
map.put(h, new ArrayList<String>());
}
map.get(h).add(str);
}
List<List<String>> ans = new ArrayList<List<String>>();
for(List<String> l : map.values()) {
ans.add(l);
}
return ans;
}
private Long hash(String str) {
long l = 0;
for(int i=0; i<str.length(); ++i) {
l += bs[str.charAt(i)-'a'];
}
return l;
}
private void init(String[] strs) {
Arrays.sort(strs);
int base = 29, b=1;
for(int i=0; i<26; ++i) {
bs[i] = b;
b *= base;
}
}
}