class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
/* 根据返回值定义存储结果的变量 */
vector<vector<string>> result;
unordered_map<string, vector<string>> map;
for (string& str: strs) {
string key = str;
/* 将串排序后便于同一作为键 */
sort(key.begin(), key.end());
/* 将相同键值的字符串放入vector容器中 */
map[key].push_back(str);//emplace_back
}
/* 取出相同键值的vector */
for (auto it = map.begin(); it != map.end(); ++it)
result.push_back(it->second);
return result;
}
};
知识点:auto原理是根据后面的值来推测auto的类型,其实就是简化初始化。
unordered_map底层的原理就是哈希表
思路:将每个字符串排序,排序后字符串相同的肯定是字母异位词,将相同的键值的字符串放入同一个vector容器当中。
我先开始想法(超时)
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> res;
if (s.size() < p.size()) {
return res;
}
unordered_map<string,vector<int>> map;
int slowIndex = 0;
int fastIndex = p.size() - 1;
while (fastIndex < s.size()) {
string temp = s.substr(slowIndex,p.size());
sort(temp.begin(), temp.end());
map[temp].push_back(slowIndex);
slowIndex++;
fastIndex++;
}
sort(p.begin(),p.end());
return map[p];
}
};
正确思路
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int sLen = s.size(), pLen = p.size();
if (sLen < pLen) {
return vector<int>();
}
vector<int> ans;
vector<int> sCount(26);
vector<int> pCount(26);
for (int i = 0; i < pLen; ++i) {
++sCount[s[i] - 'a'];
++pCount[p[i] - 'a'];
}
if (sCount == pCount) {
ans.emplace_back(0);
}
for (int i = 0; i < sLen - pLen; ++i) {
--sCount[s[i] - 'a'];
++sCount[s[i + pLen] - 'a'];
if (sCount == pCount) {
ans.emplace_back(i + 1);
}
}
return ans;
}
};
思想:利用哈希表和滑动窗口。