89 lines
2.4 KiB
JavaScript
89 lines
2.4 KiB
JavaScript
/* 3. 无重复字符的最长子串
|
||
已解答
|
||
中等
|
||
|
||
相关标签
|
||
相关企业
|
||
给定一个字符串 s ,请你找出其中不含有重复字符的 最长
|
||
子串
|
||
的长度。
|
||
|
||
示例 1:
|
||
|
||
输入: s = "abcabcbb"
|
||
输出: 3
|
||
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
|
||
示例 2:
|
||
|
||
输入: s = "bbbbb"
|
||
输出: 1
|
||
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
|
||
示例 3:
|
||
|
||
输入: s = "pwwkew"
|
||
输出: 3
|
||
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
|
||
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
|
||
|
||
提示:
|
||
|
||
0 <= s.length <= 5 * 104
|
||
s 由英文字母、数字、符号和空格组成
|
||
*/
|
||
|
||
// /*
|
||
// 思路:遍历每一个字符开始的最长字串有多少个,取最长的
|
||
|
||
// /**
|
||
// * @param {string} s
|
||
// * @return {number}
|
||
// */
|
||
// function lengthOfLongestSubstring(s) {
|
||
// let maxLength = 0;
|
||
// for (let i = 0; i < s.length; i++) {
|
||
// const set = new Set();
|
||
// let length = 0;
|
||
// for (let j = i; j < s.length; j++) {
|
||
// if (!set.has(s[j])) {
|
||
// set.add(s[j]);
|
||
// length++;
|
||
// maxLength = Math.max(maxLength, length);
|
||
// } else {
|
||
// break;
|
||
// }
|
||
// }
|
||
// }
|
||
// return maxLength;
|
||
// }
|
||
|
||
/*
|
||
思路:用一个set数组来保存当前遍历的最长不重复的字符,定义left表示不重复字符串开始的字符
|
||
right表示不重复字符串结束的字符,right一直往后面遍历,如果在set集合中没有重复的字符就直接
|
||
把这个字符加入到set集合中去,如果在set集合中有这个字符就使用使用left下标代表的字符开始删除
|
||
,知道没有right所指向的那个字符,此时set集合中的所有字符表示的就是一个新的不重复字符,我们那它
|
||
和之前的不重复字符比较,直到遍历结束找到最长的不重复字符
|
||
*/
|
||
|
||
/**
|
||
* @param {string} s
|
||
* @return {number}
|
||
*/
|
||
function lengthOfLongestSubstring(s) {
|
||
const charSet = new Set();
|
||
let maxLength = 0;
|
||
let left = 0;
|
||
const len = s.length;
|
||
for (let right = 0; right < len; right++) {
|
||
while (charSet.has(s.charAt(right))) {
|
||
charSet.delete(s.charAt(left));
|
||
left++;
|
||
}
|
||
|
||
charSet.add(s.charAt(right));
|
||
maxLength = Math.max(maxLength, right - left + 1);
|
||
}
|
||
return maxLength;
|
||
}
|
||
|
||
console.log(lengthOfLongestSubstring('aaaaabcdefgca'));
|