题目:
Given a string
s
and a non-empty stringp
, find all the start indices ofp
's anagrams in s.
Strings consists of lowercase English letters only and the length of both stringss
andp
will not be larger than 20,100.
The order of output does not matter.
Example 1:Input: s: "cbaebabacd" p: "abc" Output: [0, 6] Explanation: The substring with start index = 0 is "cba", which is an anagram of "abc". The substring with start index = 6 is "bac", which is an anagram of "abc".
Example 2:
Input: s: "abab" p: "ab" Output: [0, 1, 2] Explanation: The substring with start index = 0 is "ab", which is an anagram of "ab". The substring with start index = 1 is "ba", which is an anagram of "ab". The substring with start index = 2 is "ab", which is an anagram of "ab".
解释:
找到字符串中所有的变位词,也就是排列组合。
滑动窗口,维持一个长度为len§的窗口,用数组保存窗口中每个元素的个数,如果和p
一样则返回窗口开始的index。
python代码:
class Solution:
def findAnagrams(self, s, p):
"""
:type s: str
:type p: str
:rtype: List[int]
"""
p_count=[0]*26
for letter in p:
p_count[ord(letter)-97]+=1
_len=len(p)
current=[0]*26
result=[]
for i in range(len(s)):
current[ord(s[i])-97]+=1
#去除滑动窗口前面的一个元素
if i>=_len:
current[ord(s[i-_len])-97]-=1;
if current==p_count:
result.append(i-_len+1)
return result
c++代码:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> count_p(26,0);
for(auto letter:p)
count_p[letter-'a']+=1;
int _len=p.size();
vector<int> result;
vector<int> current(26,0);
for (int i=0;i<s.size();i++)
{
current[s[i]-'a']+=1;
if(i>=_len)
current[s[i-_len]-'a']-=1;
if (current==count_p)
result.push_back(i-_len+1);
}
return result;
}
};
总结:
如果能用数组当成字典就不要再用map/dict
了。