438.找到字符串中所有字母异位词
题目描述
思路
滑动窗口
根据题意,要在字符串s中找字符串p的异位词。因为异位词长度一定与p等长,所以在字符串s中构造一个长度为与字符串p的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母数量与字符串p的每种字母的数量相同时,则说明当前窗口是字符串p的异位词。
可以使用数组存储字符串p和滑动窗口中每种字母的数量。另外当字符串s长度小于p时,则必定不存在异位词。
Python实现
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
s_len, p_len = len(s), len(p)
ans = []
if s_len < p_len:
return ans
s_count = [0] * 26
p_count = [0] * 26
for i in range(p_len):
s_count[ord(s[i]) - 97] += 1
p_count[ord(p[i]) - 97] += 1
if s_count == p_count:
ans.append(0)
for i in range(s_len - p_len):
s_count[ord(s[i]) - 97] -= 1
s_count[ord(s[i + p_len]) - 97] += 1
if s_count == p_count:
ans.append(i + 1)
return ans
Java实现
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int s_len = s.length(), p_len = p.length();
List<Integer> ans = new ArrayList<Integer>();
if (s_len < p_len) {
return new ArrayList<Integer>();
}
int[] s_count = new int[26];
int[] p_count = new int[26];
for (int i = 0; i < p_len; ++i) {
++s_count[s.charAt(i) - 'a'];
++p_count[p.charAt(i) - 'a'];
}
if (Arrays.equals(s_count, p_count)) {
ans.add(0);
}
for (int i = 0; i < s_len - p_len; ++i) {
--s_count[s.charAt(i) - 'a'];
++s_count[s.charAt(i + p_len) - 'a'];
if (Arrays.equals(s_count, p_count)) {
ans.add(i + 1);
}
}
return ans;
}
}