无重复字符的最长子串

给定一个字符串 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的位置为之前出现的位置,删除字符串左边的数据

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容