思路
维护一个长度与p一致的窗口,记录即可。
Python版本
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
n,m = len(s),len(p)
if n < m:
return []
s_record = [0] * 26
p_record = [0] * 26
res = []
# 记录目标集合
for c in p:
p_record[ord(c) - 97] += 1
# 构建一个窗口
left,right = 0,0
for i in range(m):
s_record[ord(s[right]) - 97] += 1
right += 1
if s_record == p_record:
res.append(left)
# 移动窗口
while right < n:
s_record[ord(s[left]) - 97] -= 1
left += 1
s_record[ord(s[right]) - 97] += 1
right += 1
if s_record == p_record:
res.append(left)
return res
Java版本
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int n = s.length();
int m = p.length();
List<Integer> res = new ArrayList<Integer>();
int[] p_record = new int[26];
int[] s_record = new int[26];
if (m > n){
return res;
}
// 存储p的元素
for (int i = 0;i<m;i++){
p_record[p.charAt(i) - 'a']++;
}
// 构造窗口
int left = 0;
int right;
for (right = 0;right<m;right++){
s_record[s.charAt(right) - 'a']++;
}
if (Arrays.equals(s_record, p_record)){
res.add(left);
}
while (right < n){
s_record[s.charAt(left) - 'a']--;
left++;
s_record[s.charAt(right) - 'a']++;
right++;
if (Arrays.equals(s_record, p_record)){
res.add(left);
}
}
return res;
}
}
1777

被折叠的 条评论
为什么被折叠?



