给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true
;否则,返回 false
。
换句话说,s1 的排列之一是 s2 的 子串 。
示例 1:
输入:s1 = “ab” s2 = “eidbaooo”
输出:true
解释:s2 包含 s1 的排列之一 (“ba”).
由示例可知,s1
是s2
的子串的排列之一,也就是说在s2的s1长度的区间内,只要包含有相同元素,并且相同元素的数量相同,只用考虑元素数量,不用考虑元素的排列顺序,即为true,利用双指针,在s1
的长度区间内去寻找
map
,记录s1当前出现的元素和次数,因为全部都是小写字母,所以所有的减去'a'.charCodeAt()
就是0 - 26
,fill
初始值填充为0
-1
s2
,记录s2出现的字符,并且在相对应的位置++,因为出现过的 都是 负数,所以继续循环,吧没有在s1中出现过的–,并且更新左指针true
false
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var checkInclusion = function(s1, s2) {
let left = 0;
let s1len = s1.length,
s2len = s2.length
const cnt = new Array(26).fill(0);
const povit = 'a'.charCodeAt();
for (let i = 0; i < s1len; i++) {
--cnt[s1[i].charCodeAt() - povit];
}
for (let right = 0; right < s2len; right++) {
const x = s2[right].charCodeAt() - povit;
++cnt[x];
while(cnt[x] > 0) {
const y = s2[left].charCodeAt() - povit;
--cnt[y];
left++;
}
if (right - left + 1 === s1.length) {
return true;
}
}
return false
};
let a = checkInclusion('ab','eidbaooo')