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