题目
给定一个字符串 *s* ,找出 至多 包含两个不同字符的最长子串 *t* ,并返回该子串的长度。
分析
\1. 子串max=》 动态滑动窗口
\2. 至多包含2个不同字符串 =》 map
解法:滑动窗口
思想
1. 最长子串 =》 动态滑动窗口
2. 至多2个=》 使用map 和count 来评估是否满足条件, 如果count>2则需要左边收缩 直到满足条件未知
3. 最大长度=》 满足条件后 不断更新max
*/
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstringTwoDistinct = function (s) {
// 初始化结果
const map = {};
let max = 0;
// 左指针
let j = 0;
let count = 0;
// 迭代有指针 i
for (let i = 0; i < s.length; i++) {
// 如果有新的元素 则count ++
if (!map[s[i]]) {
count++;
map[s[i]] = 0;
}
map[s[i]] = map[s[i]] + 1;
// 如果count大于2 则左收敛j
while (count > 2 && j <= i) {
map[s[j]] = map[s[j]] - 1;
// 移除新的字符 则count--
if (map[s[j]] === 0) {
count--;
}
j++;
}
max = Math.max(max, i - j + 1);
}
return max;
};
//时间复杂度:O(n)
//空间复杂度:O(1)
总结
今天这道题是主要是练习如何使用动态的滑动窗口 来求最大连续子字符串的题目
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com
\