Skip to content
On this page

567. 字符串的排列

原题链接:LeetCode 567. 字符串的排列

题目描述

给你两个字符串 s1s2 ,写一个函数来判断 s2 是否包含 s1** **的 排列。如果是,返回 true ;否则,返回 false

换句话说,s1 的排列之一是 s2子串

示例 1:

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

示例 2:

**输入:**s1= "ab" s2 = "eidboaoo" **输出:**false

提示:

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

难度: Medium


题解代码

javascript
/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
 var checkInclusion = function(s1, s2) {
  let left = 0, right = s1.length - 1
  while(right < s2.length) {
      if (isValid(s1, s2.substr(left, s1.length))) return true
      right++
      left++
  }
  return false
};

function isValid (s1, s2) {
  const hash1 = {}, hash2 = {}, len = s1.length
  for (let i = 0; i < len; i++) {
      hash1[s1[i]] = hash1[s1[i]] ? hash1[s1[i]] + 1 : 1
  }
  for (let i = 0; i < len; i++) {
      hash2[s2[i]] = hash2[s2[i]] ? hash2[s2[i]] + 1 : 1
  }
  for (let k in hash1) {
      if (hash1[k] !== hash2[k]) return false
  }
  return true
}

技术文档集合