给定一个字符串,请找出其中无重复字符的最长子字符串。
例如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3。
对于,”bbbbb”,其无重复字符的最长子字符串为”b”,长度为1。
从左向右扫描,遇到重复的字符时,从前面出现该字符的位置的下一个字符开始,重新扫描,直到扫描到最后。例如:
abcbdefgdk
字符 | a | b | c | b | d | e | f | g | d | k |
---|---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
第一轮:从0到2
第二轮:从2到7
第三轮:从5到9
class Solution:
"""
@param: s: a string
@return: an integer
"""
def lengthOfLongestSubstring(self, s):
# write your code here
n=len(s)
start=0 #记录每轮的开始位置
repeat=0 #记录每轮出现重复的位置
end=0 #记录每轮结束的位置
length=0
while(start<n):
end=start
while( end+1<n): #当每轮没扫描最后的时候
if(s[end+1] not in s[start:end+1]):
end+=1 #没重复就end+1
else: #重复了就记录下这个重复的字符
temp=s[start:end+1]
break
if end<n-1: #有两种结束扫描的情况,一个是没扫到最后,那么就存在重复。另一种直接结束就可以了
repeat=s[start:end+1].index(temp) # 找到重复字符在前面的位置,注意,这个repeat是从start开始的偏移量
if end-start+1>length:
length=end-start+1
start=start+repeat+1 #更新start 继续扫描
return length