题目描述
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
示例
示例 1:
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
解法
1.滑动窗口
cpp
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
if(p.size() > s.size()) return {};
vector <int> ans;
string m = p;
int l = p.size();
sort(m.begin(),m.end());
for(int i = 0;i <= s.size() - l;){
string h(s,i,l);
sort(h.begin(),h.end());
if(m == h){
ans.push_back(i);
if(s[i] != s[i + l] && l != 1){
i = i + l - 1;
}else{
while(s[i] == s[i + l] && i + l < s.size()){
ans.push_back(++ i);
}
i ++;
}
}else
i ++;
}
return ans;
}
};
该算法最初的想法就是遍历一遍s,截取字串和p比较,但是这种方法会超时,于是想到,如果窗口移动过程中,出去的字符和新进来的如果是同一个字符,一定满足条件,否则不满足,可以直接跳过,减少遍历,就要考虑到p长度为1的情况,最终可以通过所有样例。