567. 字符串的排列

image.png

滑动窗口

由于输入的字符只包含小字字母,所以可以使用长度为 26 的数组记录字符出现次数,窗口每次向右滑动一格,只需要加减出窗和入窗字符的出现次数

  1. class Solution {
  2. public boolean checkInclusion(String s1, String s2) {
  3. // 如果s1的长度比s2大,直接返回false
  4. if (s1.length() > s2.length()) return false;
  5. // 存放字符出现次数
  6. int[] char1 = new int[26];
  7. int[] char2 = new int[26];
  8. // 初使根据 s1 长度初使化
  9. for (int i = 0; i < s1.length(); i++) {
  10. char1[s1.charAt(i) - 'a']++;
  11. char2[s2.charAt(i) - 'a']++;
  12. }
  13. // 如果初使化后就相同,直接返回
  14. if (Arrays.equals(char1, char2)) return true;
  15. // 从第二个字符开始往后遍历
  16. for (int i = 1; i < s2.length() - s1.length() + 1; i++) {
  17. // 注意这里每次只需要处理出窗和入窗字符
  18. // 出窗字符
  19. char2[s2.charAt(i - 1) - 'a'] --;
  20. // 入窗字符
  21. char2[s2.charAt(i + s1.length() - 1) - 'a'] ++;
  22. if (Arrays.equals(char1, char2)) return true;
  23. }
  24. return false;
  25. }
  26. }