题解一:
滑动窗口:类似于字符串匹配,但匹配异位词需要包含相同的字母及个数,可以分别用两个数组存储字符串s滑动窗口和字符串p的字母及个数,再用Array.equals()进行比对。对于s.length()<p.length()的情况需要特判。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> result = new ArrayList<>();
int sLen = s.length();
int pLen = p.length();
if (sLen < pLen) return new ArrayList<>();
int[] sArray = new int[26];
int[] pArray = new int[26];
for (int i = 0; i < pLen; i++) {
pArray[p.charAt(i) - 'a']++;
}
for (int i = 0; i < pLen; i++) {
sArray[s.charAt(i) - 'a']++;
}
if (Arrays.equals(pArray, sArray)) result.add(0);
for (int i = 0; i < sLen - pLen; i++) {
sArray[s.charAt(i) - 'a']--;
sArray[s.charAt(i + pLen) - 'a']++;
if (Arrays.equals(pArray, sArray)) result.add(i + 1);
}
return result;
}
}