无重复字符的最长子串
示例:
- 输入: s = "abcabcbb"
- 输出: 3
- 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 思考:怎么去判断是否有重复?怎么取最长length
答案:
- 判断是否有重复可以使用循环原字符串,通过一个新的数据结构来存储新的数据,用新的数据来判断是否has当前循环到的数据,中止条件has == true
- 怎么取最长呢?Math.max(oldLen,newLen) 用什么数据结构来存储新数据合适呢? 我们需要有当前的值和下标
结论:那我们可以使用map来存储,当然其他方式也可以。 代码实现:
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
// 思路:左指针,右指针,长度之差加1
let left = 0
let res = 0
let length = s.length
// 存放值和下标
let map = new Map()
// 循环字符串
for (let r=0;r<length;r++) {
if (map.has(s[r])&&map.get(s[r])>=left) {
left = map.get(s[r])+1
}
map.set(s[r],r)
res = Math.max(res, r-left+1)
}
return res
};
巧妙之处:用左指针,右指针来判断长度,当找到一个相同的字符的时候,我们需要把之前相同的这个字符delete,那我们可以通过移动左指针来实现,往后移动一位。 leedcode每日一题,坚持就是胜利。✌️