leetcode

中等哈希表双指针字符串滑动窗口

方法1 滑动窗口

  1. var checkInclusion = function (s1, s2) {
  2. // 比较两个不同的 arr 是否相同
  3. const compareDiffArr = (arr1, arr2) => {
  4. return [...arr1].sort().join() === [...arr2].sort().join()
  5. }
  6. const len1 = s1.length, len2 = s2.length,
  7. arr1 = [], arr2 = [];
  8. for (let i = 0; i < len1; i++) {
  9. arr1.push(s1[i]);
  10. arr2.push(s2[i]);
  11. }
  12. for (let i = len1; i < len2; i++) {
  13. if (compareDiffArr(arr1, arr2)) return true;
  14. arr2.splice(0, 1); // 窗口左侧向右边滑动,收缩窗口
  15. arr2.push(s2[i]); // 窗口右侧向右边滑动,扩展窗口
  16. }
  17. return compareDiffArr(arr1, arr2);
  18. };

image.png

567. 字符串的排列 - 图2

上述做法应该是可行的,不过执行超时。。。

  1. var checkInclusion = function (s1, s2) {
  2. const len1 = s1.length, len2 = s2.length;
  3. if (len1 > len2) return false;
  4. const count1 = new Array(26).fill(0), // 记录 s1 中每个字符
  5. count2 = new Array(26).fill(0); // 记录 s2 中每个字符
  6. // 初始化 count
  7. for (let i = 0; i < len1; i++) {
  8. ++count1[s1[i].charCodeAt() - 97];
  9. ++count2[s2[i].charCodeAt() - 97];
  10. }
  11. const compare = () => count1.toString() === count2.toString();
  12. for (let i = len1; i < len2; i++) {
  13. if (compare()) return true;
  14. // 滑动窗口
  15. --count2[s2[i - len1].charCodeAt() - 97];
  16. ++count2[s2[i].charCodeAt() - 97];
  17. }
  18. return compare();
  19. };

567. 字符串的排列 - 图3

重点:找到字母对应的下标。

一个萝卜一个坑,找到对应的坑后,再执行相应地操作。

方法2