#题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
#解答一
暴利破解法:找到字符串的每连续的一个子串并判断是否有重复的字符(用字典),时间复杂度O(n^3)
#解答二
移动窗口:窗口()为
[
i
,
j
)
[i,j)
[i,j),
i
≤
n
,
j
≤
n
i\le n,j\le n
i≤n,j≤n,其中
i
,
j
i,j
i,j从0开始,对字符遍历,如果字符不在窗口中,就
j
+
=
1
j+=1
j+=1,如果字符在字符串中,就
i
+
=
1
i+=1
i+=1.这样得到的窗口只能放大,不能缩小。窗口的长度即为所求。时间复杂度O(n)
#解答三
改进的移动窗口:
i
,
j
i,j
i,j初始为0,用
j
j
j对字符串遍历,遇到字符在字符串中,就将前面相同的字符的后一个字符作为窗口的第一个元素(例abcabcee),但是如果相同的字符在前面的位置太前面了(例:abcdbcda ,bcd重复,i的取值越来越大)这样
i
i
i的取值就又变小,与我们的想法不一致,对于a,我们希望是bcda。所以采取
i
i
i取值时与上一个
i
i
i比较大小。如何判断是否有相同的字符,用hash表,当然,为什么时刻更新索引+1,为保证i的取值是遍历为止的倒数第二个索引+1.
code:
class Solution:
\quad
def lengthOfLongestSubstring(self, s: str) -> int:
\quad
\quad
ans, i = 0, 0
\quad
\quad
strs = {}
\quad
\quad
for j in range(len(s)):
\quad
\quad
\quad
if s[j] in strs:
\quad
\quad
\quad
\quad
i = max(strs[s[j]],i)
\quad
\quad
\quad
ans = max(ans,j+1-i)
\quad
\quad
\quad
strs[s[j]] = j+1
\quad
\quad
return ans