![](/img/trans.png)
[英]Find the length of the longest substring with no consecutive repeating characters
[英]Length of the longest substring -Given a string S, find the length of the longest substring without repeating characters
为什么我们要使用max
function 来更新start
,我们可以直接更新start
到seen[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.