题目描述
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
解题思路
最直接的思路应该是暴力法,获得该字符串的所有子串并获取最大长度,但时间复杂度肯定超标。一次,使用滑动窗口解题:
对于不重复子串Sij,以及字符S[j+1]。若S[j+1]在Sij子串中不存在,则将j+1,若存在,则截取Sij+1中不重复子串,在此过程中记录出现过的最大长度即为结果

代码
JS版
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let maxString = 0;
let i = 0, j = 0;
let strSet = new Set();
let n = s.length;
while(i < n && j < n){
let char = s.charAt(j);
if(strSet.has(char)){
strSet.delete(s.charAt(i++));
}else{
strSet.add(s.charAt(j++));
maxString = Math.max(maxString, j - i);
}
}
return maxString;
};
TS版
/**
* @param {string} s
* @return {number}
*/
const lengthOfLongestSubstring = (s:string):number => {
let maxString:number = 0;
let i:number = 0, j:number = 0;
let strSet:Set<string> = new Set();
let n:number = s.length;
while(i < n && j < n){
let char:string = s.charAt(j);
if(strSet.has(char)){
strSet.delete(s.charAt(i++));
}else{
strSet.add(s.charAt(j++));
maxString = Math.max(maxString, j - i);
}
}
return maxString;
};
PY版
#
# @lc app=leetcode id=3 lang=python3
#
# [3] Longest Substring Without Repeating Characters
#
# @lc code=start
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:return 0
lookup = list()
n = len(s)
max_len = 0
cur_len = 0
for i in range(len(s))):
val = s[i]
if not val in lookup:
lookup.append(val)
cur_len+=1
else:
index = lookup.index(val)
lookup = lookup[index+1:]
lookup.append(val)
cur_len = len(lookup)
if cur_len > max_len:
max_len = cur_len
return max_len
# @lc code=end
时间复杂度
O(2n) = O(n),最糟糕情况即为ij均遍历完全
优化:在处理i时,可以不用一步步便利,直接采取map结构储存,并直接删除至重复重复字母,此时时间复杂度为O(n);