567. 字符串的排列
滑动窗口
由于输入的字符只包含小字字母,所以可以使用长度为 26 的数组记录字符出现次数,窗口每次向右滑动一格,只需要加减出窗和入窗字符的出现次数
class Solution {public boolean checkInclusion(String s1, String s2) {// 如果s1的长度比s2大,直接返回falseif (s1.length() > s2.length()) return false;// 存放字符出现次数int[] char1 = new int[26];int[] char2 = new int[26];// 初使根据 s1 长度初使化for (int i = 0; i < s1.length(); i++) {char1[s1.charAt(i) - 'a']++;char2[s2.charAt(i) - 'a']++;}// 如果初使化后就相同,直接返回if (Arrays.equals(char1, char2)) return true;// 从第二个字符开始往后遍历for (int i = 1; i < s2.length() - s1.length() + 1; i++) {// 注意这里每次只需要处理出窗和入窗字符// 出窗字符char2[s2.charAt(i - 1) - 'a'] --;// 入窗字符char2[s2.charAt(i + s1.length() - 1) - 'a'] ++;if (Arrays.equals(char1, char2)) return true;}return false;}}
