首先根据异位词的定义,我们只需要保证这个子串和目标字符串的构成字符一致即可,即维护一个窗口,保证窗口中的所有字符和串 p 的所有字符一致即可。串 p 的特征可以用一个26位长的数组来表示,即每个字符出现的次数,之后维护窗口时动态的更新另一个用于记录窗口字符信息的26位数组,当这两个数组的内容一致时,我们认为找到了这个重排形成的字符串,即窗口框住的串。
classSolution { public List<Integer> findAnagrams(String s, String p) { List<Integer> ans = newArrayList<>(); char[] sArr = s.toCharArray(), pArr = p.toCharArray(); int[] count = newint[26]; int[] countTmp = newint[26]; for (char c : pArr) { count[c - 'a']++; } intleft=0; for (inti=0; i < sArr.length; i++) { countTmp[sArr[i] - 'a']++; if (countTmp[sArr[i] - 'a'] > count[sArr[i] - 'a']) { while (left < i && sArr[left] != sArr[i]) { countTmp[sArr[left] - 'a']--; left++; } countTmp[sArr[left] - 'a']--; left++; } if (checkTwoArr(countTmp, count)) { ans.add(left); } } return ans; }
booleancheckTwoArr(int[] a, int[] b) { if (a.length == b.length) { for (inti=0; i < a.length; i++) { if (a[i] != b[i]) { returnfalse; } } returntrue; } returnfalse; } }