繁体   English   中英

Length of the longest substring - 给定一个字符串S,找出最长的substring的长度,没有重复字符

[英]Length of the longest substring -Given a string S, find the length of the longest substring without repeating characters

为什么我们要使用max function 来更新start ,我们可以直接更新startseen[S[i]]+1

def longestUniqueSubsttr(self, S):
        # code here
        seen={}
        start=0
        max_len=0
        for i in range(len(S)):
            if S[i] in seen:
                #Why should we use a `max` function to update `start` when 
                #we can directly update `start` to `seen[S[i]]+1
                start=max(start,seen[S[i]]+1)
            seen[S[i]]=i
            max_len=max(max_len,i-start+1)
        return max_len

既然可以直接更新 start >to seen[S[i]]+1,为什么还要用最大 function 来更新 start?

使用随机字符串

S = 'zszhvbuthsjvkblsrrrrtttyyergsvkd'
seen={}
start=0
max_len=0
for i in range(len(S)):
    if S[i] in seen:
        start= max(start, seen[S[i]]+1)
    seen[S[i]]=i
    max_len=max(max_len,i-start+1)
print(max_len)

Output:

9

如果您不使用最大值,您的“开始”值将不会考虑字符串中相同字母的倍数。 你不会从最后一次重复开始,而是第一次

S = 'zszhvbuthsjvkblsrrrrtttyyergsvkd'
seen={}
start=0
max_len=0
for i in range(len(S)):
   if S[i] in seen:
       start=  seen[S[i]]+1
   seen[S[i]]=i
   max_len=max(max_len,i-start+1)
print(max_len)

Output:

19

如果你愿意更换

start=max(start,seen[S[i]]+1)

经过

start=seen[S[i]]+1

那么你将不会总是得到正确的结果。 例如,对于S="abcaab" ,它将更改返回值。

原因是start只允许增加,不能减少。 如果允许减少,那么 substring 将被视为候选字符,而实际上它里面会有一个重复的字符。

在给定的示例中,会发生以下情况:

  • i为 3 时,遇到重复的字母“a”,将seen[S[i]] + 1 (即seen["a"] + 1 ,即 1)赋给start

  • i为4时,再次遇到字母“a”,将seen[S[i]] + 1 (即seen["a"] + 1 ,即4)赋值给start

  • i为5时,遇到字母“b”是重复的,现在seen[S[i]] + 1 (也就是seen["b"] + 1 ,也就是2)不应该赋值start ,因为最长的 substring 不是在第一个“b”之后开始的,而是在第一个“a”之后!

这就是为什么你需要max的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM