2021.05.12找到字符中所有目标子串的字母异位词
题目描述
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
数据规模和约定
字母异位词指字母相同,但排列不同的字符串。(也可能是本身)
不考虑答案输出的顺序。
思路
- 固定滑动窗子的长度,进行滑动
- 判断两个子串是否是字母异位词,可以用cnt记录单词数目,再用Arrays.equal进行判断。
代码
public List<Integer> findAnagrams(String s, String p) {
List<Integer> res = new ArrayList<Integer>();
int slen = s.length(), plen = p.length();
int[] scnt = new int[26], pcnt = new int[26];
//判断第一个框
for(int i = 0; i < p.length(); i++) { //遍历chs中元素
scnt[s.charAt(i)-'a']++;
pcnt[p.charAt(i)-'a']++;
}
if(Arrays.equals(scnt, pcnt)) res.add(0); //判断是否符合
int left = 0, right = left+plen;
while(right < slen) {
//进第right个单词
scnt[s.charAt(right)-'a']++;
right++;
//出第left个单词
scnt[s.charAt(left)-'a']--;
left--;
if(Arrays.equals(scnt, pcnt)) res.add(0);
}
return res;
}