学习他人答法
解题思路
举个例子,字符串S=“abc”,其无重复最长子串是’abc’,那么再在字符串‘abc’后加个字符’d’,变成字符串S1’‘abcd’,其无重复最长子串是什么?
S结尾加上’d’之后,最长无重复子串有两种可能:
最长无重复子串包含新增的’d’,即’cd’
最长无重复子串不包含新增的’d’,即S1的最长无重复子串’abc’
比较’cd’与’abc’,len(‘abc’)>len(‘cd’),所以S1的最长无重复子串依然是’abc’
所以已知一个字符串Si,其长度为L,在Si末尾加入字符‘C’,即Si+1=Si+C,那么Si+1的最长子串就是:
length(Si+1)=max(L,len(以C结尾的无重复子串))
查找新增字符结尾的无重复子串长度是向左搜索,再求以s为结尾的无重复子串长度,接下来再考虑特殊情况字符串为0和1
代码:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if s == '':
return 0
if len(s) == 1:
return 1
def find_left(s, i):
tmp_str = s[i]
j = i - 1
while j >= 0 and s[j] not in tmp_str:
tmp_str += s[j]
j -= 1
return len(tmp_str)
length = 0
for i in range(0, len(s)):
length = max(length, find_left(s, i))
return length