给定一个字符串 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不能为空的边界判断,将s先转成数组
- 给一个双指针j,第二个指针,为了每一次重复取出之后,下一次遍历能够在开始时候的后一位
- 比如说”aab”, 第二个a开始重复会取出第一个a,然后下次遍历应该是从第二个a开始
- 如果 everyItem 中没有与str[i]重复的,放进去,然后下一位
- 如有有重复的,组织hash表
- 当前everyItem的length为key,value为everyItem每一项组成的字符串
- 清空掉 everyItem 为了下一次放进去不重复的字符串
- 第二个指针往后移动一个,从第二个指针开始遍历
var lengthOfLongestSubstring = function (s) {// 不能为空if (s === '') return 0// 先转成数组const str = s.split('')const res = {};const everyItem = [];// 第二个指针,为了每一次重复取出之后,下一次遍历能够在开始时候的后一位// 比如说"aab", 第二个a开始重复会取出第一个a,然后下次遍历应该是从第二个a开始let j = 0for (let i = 0; i < str.length;) {// 如果 everyItem 中没有与str[i]重复的,放进去,然后下一位// 如有有重复的,组织hash表// 当前everyItem的length为key,value为everyItem每一项组成的字符串// 清空掉 everyItem 为了下一次放进去不重复的字符串// 第二个指针往后移动一个,从第二个指针开始遍历if (everyItem.indexOf(str[i]) === -1) {everyItem.push(str[i]);i++} else {res[everyItem.length] = everyItem.join("")everyItem = []j += 1i = j}}// 避免 undefined,有的可能为:' 'const num = Object.keys(res).pop() || 0// 避免最后没有重复的return Math.max(num, everyItem.length) || 1}const s = lengthOfLongestSubstring("aab")console.log(s);
