「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
Hope is a good thing, maybe the best of things. And no good thing ever dies.
题目
给定一个字符串 s ,找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
题目分析
- 我们在字符串
S中使用双指针中的左右指针技巧,初始化left = right = 0,把索引闭区间[left, right]称为一个「窗口」。 - 我们先不断地增加
right指针扩大窗口[left, right],直到窗口中的字符串符合要求(包含了t中的所有字符) - 我们停止增加
right,转而不断增加left指针缩小窗口[left, right],直到窗口中的字符串不再符合要求(不包含T中的所有字符了)。同时,每次增加left,我们都要更新一轮结果 - 重复第 2 和第 3 步,直到
right到达字符串S的尽头
解题
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
// 窗口中的字符
let window = {};
// 左右指针
let left = 0,
right = 0;
// 记录结果
let res = 0;
while (right < s.length) {
// 即将移入窗口的字符
let c = s[right];
// 右移窗口
right++;
// 进行窗口内数据的一系列更新
window[c] = (window[c] || 0) + 1;
while (window[c] > 1) {
let d = s[left];
left++;
// 进行窗口内数据的一系列更新
window[d]--;
}
// 在这里更新答案
res = Math.max(res, right - left);
}
return res;
附参考:
结语
如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。
文章如有错误之处,希望在评论区指正🙏🙏
欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后 」