49.
- 没有顺序的要分类,一定要排序下!!、
- 排序之后就可以找到唯一的key
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ans;
unordered_map<string, vector<string>> dict;
for(auto str: strs){
string tmp = str;
sort(str.begin(), str.end());
if(dict.find(str) == dict.end()){
dict[str].push_back(tmp);
}
}
for(auto a: dict){
ans.push_back(a.second);
}
return ans;
}
};
//注意每个都要放进去的,不要
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ans;
unordered_map<string, vector<string>> dict;
for(auto str: strs){
string tmp = str;
sort(str.begin(), str.end());
dict[str].push_back(tmp);
}
for(auto a: dict){
ans.push_back(a.second);
}
return ans;
}
};
242.
通过26个字母区分效果更佳!效率更高
242.
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> dict(26, 0);
if(s.size() != t.size()) return false;
for(int i=0; i<s.size(); i++){
dict[s[i]-'a']++;
dict[t[i]-'a']--;
}
for(auto a: dict){
if(a != 0) return false;
}
return true;
}
};
class Solution {
public:
bool isAnagram(string s, string t) {
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s==t;
}
};
438.
//判断两个单词是否相同
bool check(int s[], int p[]) {
for (int i = 0; i < 26; i++) {
if (s[i] != p[i]) {
return false;
}
}
return true;
}
vector<int> findAnagrams(string s, string p) {
vector<int> res;
if (p.size() > s.size()) {
return res;
}
//采用数组代替哈希表,速度更快,但是要自己写判断函数
int s_cnt[26] = { 0 };
int p_cnt[26] = { 0 };
for (int i = 0; i < p.size(); ++i) {
s_cnt[s[i] - 'a']++;
p_cnt[p[i] - 'a']++;
}
if (check(s_cnt,p_cnt)) {
res.emplace_back(0);
}
int l = 0;
int r = p.size() - 1;
while (r < s.size() - 1) {
s_cnt[s[l++] - 'a']--;
s_cnt[s[++r] - 'a']++;
if (check(s_cnt, p_cnt)) {
res.emplace_back(l);
}
}
return res;
}
//我的
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> ans;
int ss[26], pp[26];
for(auto a: p){
ss[a-'a']++;
pp[a-'a']++;
}
int l =0, r = p.size()-1;
while(r< s.size()){
if(check(ss, pp)) ans.push_back(l);
ss[s[l]-'a']--;
ss[s[r]-'a']++;
l++;
r++;
}
return ans;
}
bool check(int ss[26], int pp[26]){
for(int i=0; i<26; i++){
if(ss[i]!= pp[i]) return false;
}
return true;
}
};