3. 无重复字符的最长子串
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例
- 示例一
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
- 示例二
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
- 示例三
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路
设置一个左游标,记录不重复子字符串的在整个字符串中的左边的起始位置,依次循环整个 str,当找到重复字符时候,左游标右移,移动的距离是,当前左游标加上子字符串中找到重复字符的位置索引;
代码
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
if (!s.length) return 0;
let curStr = ""; // 每次循环找到的不含重复字符的子字符串
let maxStrLen = 0; // 最大不含重复字符的子字符串的长度
const len = s.length;
let left = 0; // 不含重复字符的子字符串的左游标
for (let i = 0; i < len; i++) {
if (curStr.indexOf(s[i]) !== -1) {
left += s.slice(left, i).indexOf(s[i]) + 1;
continue;
}
//slice(start,end)截取字符串不包括end位置处的元素,所以这里要加上一个1
curStr = s.slice(left, i + 1);
maxStrLen = Math.max(maxStrLen, curStr.length);
}
return maxStrLen;
};