每日刷题第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 <= 104s1和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;
};