一起来刷leetcode(3)——无重复字符的最长子串

214 阅读1分钟

努力有时也战胜不了天分

但至少能让别人看得起你

前言

病人:“大夫,这段时间我总是脱发。”
医生:“没关系,再过段时间就不脱了。”
病人担心的说:“再过段时间就脱完了。”
医生:“对呀,脱完不会再脱了。”

年纪轻轻的,有足够的健康用来还钱
出来混,迟早是要还的
年纪大了,就有足够的钱变年轻了 ^_^

1 思路分析

输入: s = "abcabcbb"
输出: 3

1.1 基本步骤

  1. 遍历字符串
  2. 统计不重复子串
  3. 与当前最大长度比较
  4. 返回最大长度

1.2 重点步骤

统计不重复子串

2.1 标记起点 start

2.2 标记终点 end

2.3 计算 len = end - start

2.4 如果重复,删除重复,并重新标记起点

重新标记起点

2.4.1 找到原有起点

2.4.2 依次删除重复,并移动起点

2.4.3 直至重复点下一位置

2 代码片段

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
  const set = new Set()
  let start = 0
  let maxLen = 0
  for (let end = 0; end < s.length; end++) {
    // 依次删除重复点,并移动起点
    // 直至重复点下一位置
    while (set.has(s[end])) {
      set.delete(s[start])
      start++
    }

    set.add(s[end])
    // 统计当前不重复子串
    // 与当前最大长度比较
    maxLen = Math.max(maxLen, end - start + 1)
  }
  return maxLen
}

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
  const m = new Map()
  let start = 0
  let maxLen = 0
  for (let end = 0; end < s.length; end++) {
    // 查找重复点下一位置
    // 重复点必须在起点后面
    if (m.has(s[end]) && m.get(s[end]) > start) {
      start = m.get(s[end])
    }

    m.set(s[end], end + 1)
    maxLen = Math.max(maxLen, end - start + 1)
  }
  return maxLen
}

3 技巧总结

1.Set

// a = []
s = new Set()

// a.length
s.size

// a.push(0)
s.add(0)

// a.includes(0)
s.has(0)

// a.filter(v =>v !== 0)
s.delete(0)

// a = []
s.clear()

2.寻找指定位置

const s = 'abcabcbb'

// indexOf
// 在上次基础上查
const index1 = s.index('b')
const index2 = s.index('b', index1)

// map
// 边更新边查
const m = new Map()
const index = -1
for (let i = 0; i < s.length; i++) {
  if (m.has('b')) {
    index = m.get('b')
  }

  m.set(s[i], i)
}

// set
// 边删边查
const set = new Set()
const index = -1
for (let i = 0; i < s.length; i++) {
  while (set.has('b')) {
    index = index + 1
    set.delete(s[index])
  }

  set.add(s[i])
}


忘记以前的不开心


因为以后会更不要开心

参考链接

往期回顾