add solution2

This commit is contained in:
ShusenTang 2020-06-20 10:43:47 +08:00 committed by GitHub
parent a329eed756
commit 0991490c09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,5 +1,7 @@
# [49. Group Anagrams](https://leetcode.com/problems/group-anagrams/)
# 思路
## 思路一
题目要求找出字符串数组里的anagram(同字母异序词),所有的字母都是小写字母。
如何判断两个字符串是否是anagram呢有两种方法:
1. 先排序再判断排序后的字符串是否相等;
@ -14,7 +16,15 @@
注意: unordered_map对应hash比map对应红黑树快一些所以使用map的时候如果追求时间复杂度则一律使用unordered_map。
## 思路二
讨论区还有一种比较tricky的方法思路一我们先进行排序的目的是方便后续判断【26个字母出现次数】是否完全一样如果一样就是anagram。我们也可以将26个字母用26个不同的素数代替然后将字符串中所有字母对应的素数乘起来如果两个字符串最后得到的乘积相等那么是anagram。
注意这个乘积可能很大亲测long long还会溢出unsigned long long才不会溢出。所以说此种方法仅供开阔思路。
时间复杂度同思路一
# C++
## 思路一
``` C++
class Solution {
private:
@ -48,3 +58,27 @@ public:
}
};
```
## 思路二
``` C++
class Solution {
public:
vector<int> primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101};
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>>res;
unordered_map<unsigned long long, int>mp;
for(string s: strs){
unsigned long long hash = 1;
for(char c: s)
hash *= primes[c - 'a'];
if(!mp.count(hash)){
res.push_back({s});
mp[hash] = res.size();
}
else res[mp[hash] - 1].push_back(s);
}
return res;
}
};
```