checkInclusion
checkInclusion
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
*
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
function checkInclusion(s1, s2) {
function isPermutation(s, map) {
for (const char of s) {
if (!map.has(char)) return false;
const count = map.get(char);
if (count === 1) {
map.delete(char);
} else {
map.set(char, count - 1);
}
}
return map.size === 0;
}
// s2长度必须大于S1
if (s2.length < s1.length) return false;
// 将s1转为map
const chars = new Map();
for (const char of s1) {
chars.set(char, chars.get(char) + 1 || 1);
}
for (let i = 0; i < s2.length; i += 1) {
if (chars.has(s2[i])) {
const clone = new Map(chars);
if (isPermutation(s2.substring(i, i + s1.length), clone)) {
return true;
}
}
}
return false;
}