438.找到字符串中所有字母异位词
目录
- 一、题目
- 二、思路
- 2.1 解题思路
- 2.2 代码尝试
- 2.3 疑难问题
- 三、解法
- 四、收获
一、题目
给定两个字符串 s 和 p,找到 s 中所有 p 的
异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
二、思路
2.1 解题思路
如何判断异位词?怎样的数据结构能够维护这个abc异位词?->哈希表
用两个哈希表来比较字符
2.2 代码尝试
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
hash_map;
hash_map_p;
vector<int> out;
for(){
hash_map_p.emplace();
}
for(int i=0;){
hash_map.emplace();
if(hash_map==hash_map_p){
out.emplace(hash_map.second)
}
}
}
};
2.3 疑难问题
有一点思路,但是写起来有点困难,哈希表生疏了。
如何创建哈希表?已经忘记了
三、解法
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;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/1123971/zhao-dao-zi-fu-chuan-zhong-suo-you-zi-mu-xzin/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
四、收获
哈希表就是用vector将字母映射到0-26的数组中。利用s[i]-‘a’,哈希表的比较就是数组是否相同,=
滑动窗口一般都需要有一个数据结构来动态维护,之前已经碰到过了用优先队列(大根堆),这次是哈希表,后面如果需要有变体的话,估计也就是换换数据结构,改改逻辑判断。大致的解题思路差不多。