feat: 无重复字符的最长字串 (3)

This commit is contained in:
= 2024-06-05 18:09:57 +08:00
parent 7057f27ba2
commit fe8572dd0e

View File

@ -0,0 +1,88 @@
/* 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'));