这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 **最长子串 **的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个_子序列,_不是子串。
示例 4:
输入: s = "" 输出: 0
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
解题思路
思路1
双指针+Set
定义一个区间,每次移动一下取间的起点或者重点。
移动区间之后改变当前包含的总字符Set集。
1.当end的值不在Set里,区间终点右移。
2.当end的值在Set里,区间起点右移,直到arr[start]==arr[end],结束右移,区间终点+1
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
if(s.length<=1)return s.length
let arr = Array.from(s)
let set = new Set()
let start=0
let end = 1
let maxLen = 0
set.add(arr[0])
while(start<=end&&start<arr.length&&end<arr.length){
if(!set.has(arr[end])){
maxLen = Math.max(maxLen,end-start)
set.add(arr[end])
end++
}else{
while(start<end){
const result = arr[end]==arr[start]
if(result){
start++
end++
break
}else{
set.delete(arr[start])//左边右移之后,将该位置移除字符集
start++
}
}
}
}
return maxLen+1
};
思路2
执行用时:240 ms, 在所有 JavaScript 提交中击败了17.47%的用户
内存消耗:44.1 MB, 在所有 JavaScript 提交中击败了18.98%的用户
最拉解法
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
if(!s.length) return 0
let res = 1
for(let i = 0; i < s.length; i++){
let a = new Set()
r = i
while(r < s.length&&!a.has(s[r])){
a.add(s[r])
r++
}
res = Math.max(res,a.size)
}
return res
};
最后
曾梦想仗剑走天涯
看一看世界的繁华
年少的心总有些轻狂
终究不过是个普通人
无怨无悔我走我路
「前端刷题」No.3