1.题目描述
给定两个字符串 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" 的异位词。
2.解题思路
先把p字符串排序,可以用vector自带的sort函数,然后对主字符串循环,每次遍历size大小个字符,遍历n次,每次遍历的操作:先把窗口内的字符排序,然后一次和p字符串对比即可。
3.代码
下面先给一些用到的函数
1.string temp = s.substr(i, wnd_size);//截取字符串s,下标从i开始,截取wnd_size个字符赋值给temp;
2.sort(temp.begin(), temp.end());
cpp
vector<int> findAnagrams(string s, string p) {
vector<int> res;
int wnd_size = p.size();
if(wnd_size>s.size()){
return res;
}
int i = 0;
sort(p.begin(),p.end());
while(i<=s.size()-wnd_size){
// 截取当前窗口的子串(避免修改原s)
string temp = s.substr(i, wnd_size);
// 对窗口子串排序(左闭右开,范围是[0, wnd_size))
sort(temp.begin(), temp.end());
int j=0;
while(j<wnd_size){//对比字符是否完全一致
if(temp[j]!=p[j]){
break;
}
if(j==wnd_size-1){
res.push_back(i);
}
j++;
}
i++;
}
return res;
}
};
虽然说是On方的时间复杂度,AC不了,但是个人认为我写的代码比官方好理解也更加适合普通人。