美文网首页
无重复字符的最长子串

无重复字符的最长子串

作者: 离陌夕 | 来源:发表于2022-05-18 16:30 被阅读0次

给定一个字符串 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 由英文字母、数字、符号和空格组成

暴力解法

function lengthOfLongestSubstring(s) {
  let maxLen = 0;
  if (s.length === 1) {
    return 1
  }
  for (let i = 0, len = s.length; i < len-1; i++) {
    let nowStr = s[i]
    if (len - maxLen < 0) {
      break
    }
    for (let j = i + 1; j < len; j++) {
      if (nowStr.includes(s[j])) {
        break;
      }
      nowStr += s[j]
    }
    maxLen = maxLen > (nowStr.length) ? maxLen : (nowStr.length)
  }
  return maxLen
}

滑动指针

function lengthOfLongestSubstring(s) {
  let maxLen = 0;
  let map = new Map()
  for (let start = 0, end = 0, len = s.length; end < len; end++) {
    if (map.has(s[end])) {
      start = Math.max(map.get(s[end]), start)
    }
    map.set(s[end], end + 1)
    maxLen = Math.max(maxLen, end - start + 1)
  }
  return maxLen
}

滑动指针解法:
比如有字符串abcabcbb:
从左边的a开始,此时start为0,end持续向右移动,并存储每次移动的字符的最新位置,当发现当前end的值已经在之前出现过了,更新最新start的位置为之前出现的位置,删除字符串左边的数据

相关文章

网友评论

      本文标题:无重复字符的最长子串

      本文链接:https://www.haomeiwen.com/subject/qluaurtx.html