1,题目要求
Given a string s and a non-empty string p, find all the start indices of p’s anagrams in s.
Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.
The order of output does not matter.
给定两个字符串,判断的字符串中是否存在子串,使得其为第二个字符串的相同字母组成。
anagram:词的字母顺序变换后组成的新词。
返回这样的字符子串的起始的索引值。
2,题目思路
连续的固定长度的比较,所用到的是“窗口”的思想。通过移动这样的窗口来判断对应的子串是否满足条件。窗口的移动是通过修改开头的旧元素和添加新元素来实现的。
3,程序源码
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int>sv (26,0), pv (26, 0), res;
int s_len = (int)s.size(), p_len = (int)p.size();
if(s_len < p_len)
return res;
for(int i = 0;i<p_len;i++)
{
sv[s[i] - 'a']++;
pv[p[i] - 'a']++;
}
if(sv == pv)
res.push_back(0);
for(int i = p_len;i<s_len;i++)
{
//调整窗口
sv[s[i] - 'a']++;
sv[s[i-p_len] - 'a']--;
if(sv == pv)
res.push_back(i+1-p_len);
}
return res;
}
};