剑指 Offer II 014. 字符串中的变位词(滑动窗口模块)

86 阅读1分钟

每日刷题第8天 2021.1.3

字符串中的变位词

  • 难度:中等

题目

  • 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 ****的某个变位词。
  • 换句话说,第一个字符串的排列之一是第二个字符串的 子串 。

示例

输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
输入: s1= "ab" s2 = "eidboaoo"
输出: False

提示

  • 1 <= s1.length, s2.length <= 104
  • s1 和 s2 仅包含小写字母

解法

/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var checkInclusion = function(s1, s2) {
  // 处理数据
  let map1 = new Map();
  for (let i = 0; i < s1.length; i++) {
    if (map1.has(s1[i])) {
      map1.set(s1[i], map1.get(s1[i]) + 1);
    }else {
      map1.set(s1[i], 1);
    }
  }
  // console.log('s1数据处理',map1.size);
  let start = 0;
  let end = 0;
  let len1 = s1.length;
  let len2 = s2.length;
  // 计算长度
  let tempt = 0;
  // 另一个记录的map
  let map2 = new Map();
  let flag = false;
  while (end < len2) {
    // 判断是否存在map中
    // 不存在
    if (!map1.has(s2[end])) {
      start = end + 1;
      end++;
      map2.clear();
      tempt = 0;
      // console.log('start',start,'end',end);
    }else {
      // 存在
      tempt++;
      // 记录在另一个map中
      if (map2.has(s2[end])) {
        map2.set(s2[end], map2.get(s2[end]) + 1);
        // 如果当前的字母超出个数,需要进行处理
        // console.log('处理',s2[end],map2.get(s2[end]),map1.get(s2[end]));
        while (map2.get(s2[end]) > map1.get(s2[end])) {
          map2.set(s2[start], map2.get(s2[start]) - 1);
          start++;
          tempt--;
        }
      }else {
        map2.set(s2[end], 1);
      }
      // console.log('map2 记录在另一个之中',map2,'map1==',map1);
      // 判断长度是否等于len1
      // console.log('tempt',tempt);
      if (tempt == len1) {
        // console.log('寻找到合适的长度',map1.size,map2.size);
        // 判断两个map集合是否完全相同
        if (map1.size == map2.size) {
          // 判断内部的数值是否相同
          for (let key in map1) {
            if (map2.get(key) != map1.get(key)) {
              console.log('get key','map1',map1.get(key),'map2',map2.get(key));
              // 虽然长度相同,但是字母数字不对
              flag = true;
              start = end + 1;
              tempt = 0;
              // 清空记录map
              map2.clear();
              break;
            }
          }
        }else {
          flag = true;
        }
        if (!flag) {
          return true;
        }
      }
      end++;
    }
  }
  return false;
};

附录