题目
https://leetcode-cn.com/problems/permutation-in-string/
代码
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var checkInclusion = function(s1, s2) {
let len1 = s1.length;
let len2 = s2.length;
//记录所有的字符和对应的数量
let map = new Map();
for (element of s1){
if(!map.has(element)){
map.set(element,1);
}else{
map.set(element, map.get(element) + 1);
}
}
//终止条件:s2的子串的长度和s1长度相等
//可以进行查找的时候:首先第一个字符必须是s1里面的,开始时,s2剩下的位置不能短于s1
//只有存在符合条件的字母的时候,不再增加i,开始判断
//当j碰壁的时候有两种情况,一种是碰到了不在s1里面的字符,另一种是数目超过了s1里的库存
let i = 0, j = 0;
while (i <= len2 - len1){//s2剩下的位置不能短于s1
//s2没有的时候i不停
//当没有这个字符的时候,带着j一起跑
if (!map.has(s2[i])){//s1里只要有过,就有记录
i++;
j = i;
}else{
while(j < len2 && map.has(s2[j]) && map.get(s2[j]) > 0){
map.set(s2[j],map.get(s2[j])-1);//注意这里不能写成map.set(s2[j++],map.get(s2[j])-1),会导致后面的j加错
j++;
}
//这里是因为j会多跑一格,所以不用写成j - i + 1
if (j - i === len1){
return true;
}else{
map.set(s2[i],map.get(s2[i])+1);//i只前进一位
i++;
}
}
}
return false;
};
附:官方题解是直接滑动的,javascript在比较两个array的时候需要转化成字符串
附上官方题解:
var checkInclusion = function(s1, s2) {
const n = s1.length, m = s2.length;
if (n > m) {
return false;
}
const cnt1 = new Array(26).fill(0);
const cnt2 = new Array(26).fill(0);
for (let i = 0; i < n; ++i) {
++cnt1[s1[i].charCodeAt() - 'a'.charCodeAt()];
++cnt2[s2[i].charCodeAt() - 'a'.charCodeAt()];
}
if (cnt1.toString() === cnt2.toString()) {
return true;
}
for (let i = n; i < m; ++i) {
++cnt2[s2[i].charCodeAt() - 'a'.charCodeAt()];
--cnt2[s2[i - n].charCodeAt() - 'a'.charCodeAt()];
if (cnt1.toString() === cnt2.toString()) {
return true;
}
}
return false;
};
//作者:LeetCode-Solution
//来源:力扣(LeetCode)