努力有时也战胜不了天分
但至少能让别人看得起你
前言
病人:“大夫,这段时间我总是脱发。”
医生:“没关系,再过段时间就不脱了。”
病人担心的说:“再过段时间就脱完了。”
医生:“对呀,脱完不会再脱了。”
年纪轻轻的,有足够的健康用来还钱
出来混,迟早是要还的
年纪大了,就有足够的钱变年轻了 ^_^
1 思路分析
输入: s = "abcabcbb"
输出: 3
1.1 基本步骤
- 遍历字符串
- 统计不重复子串
- 与当前最大长度比较
- 返回最大长度
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])
}
忘记以前的不开心
因为以后会更不要开心