LeetCode 483:Find All Anagrams in a String(找到字符串中所有字母异位词)
Q: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.
翻译君:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
说明:
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
这题和我之前说的LeetCode 3很类似,很容易想到用滑动窗口来解决。
这里就直接贴代码,不做具体的分析了。当你理解了滑动窗口再来看代码还是很简单的。
vector<int> findAnagrams(string s, string p) {
int smap[256]={0};
int pmap[256]={0};
vector<int> res;
if(s.size()<p.size()) return res;
int l=0,r=0; //窗口的范围
int plen=p.size();
int count=0; //统计p中的字符在s的窗口中出现的次数
for(int i=0;i<p.size();i++)
pmap[p[i]]++;
while(r<s.size()){
smap[s[r]]++;
if(smap[s[r]]<=pmap[s[r]])
count++;
if(r-l+1==plen){
if(count==plen) res.push_back(l); //s的窗口和p一样长并且p中的字符全部在s的窗口中出现,将第首元素下标
smap[s[l]]--; //因为窗口需要右移所以需要先将左指针指向的字符去掉
if (smap[s[l]] < pmap[s[l]])
count--; //如果左指针指向的字符在p里面还需要将count--
l++;
}
r++;
}
return res;
}
我的这个解法其实并不完全符合题意,题意将字符串内容限制在26个小写英文字母,但是我的解法将字符串内容扩大到256个ASCII码里的所有字符了。好处很明显,是解决的范围更广了。但是相对来说,效率就变得略低了。