算法 【滑动窗口+字符计数数组】LCR_014_字符串的排列 求解代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 public boolean checkInclusion(String s1, String s2) { if (s1.length() > s2.length()) { return false; } int[] a = new int[26]; // 统计s1的字符出现次数 int[] b = new int[26]; // 统计s2滑动窗口内的字符出现次数 for (int i = 0; i < s1.length(); i++) { a[s1.charAt(i) - 'a']++; // s1的第i个字符对应数组下标(如'a'→0,'b'→1),计数+1 b[s2.charAt(i) - 'a']++; // 先统计s2前s1.length()个字符的计数 } //用于比较两个数组的内容是否完全相等 if (Arrays.equals(a, b)) { return true; } // 初始窗口是[0, s1.length()-1],右边界从s1.length()开始 int left = 0; int right = s1.length(); while (right < s2.length()) { // 右边界字符加入窗口:计数+1 b[s2.charAt(right) - 'a']++; // 左边界字符移出窗口:计数-1 b[s2.charAt(left) - 'a']--; // 检查当前窗口计数是否匹配 if (Arrays.equals(a, b)) { return true; } // 窗口右移:左、右边界各+1 right++; left++; } return false; }