제목 : 문자열을 감안할 때, 당신은 반복되는 문자의 긴 문자열의 하위 길이를 포함하지 않는 알아보십시오.
예 1 :
입력 : "abcabcbb"
출력 : 3
설명 : 길이가 3 있도록 반복없이 문자의 긴 문자열이 "ABC"이기 때문입니다.
예 2 :
예 2 :
입력 : "BBBBB"
출력 : 1
설명 : 길이가 1 그래서, "b"를하지 않고 문자를 반복 가장 긴 문자열이 있기 때문에.
예 3 :
예 3 :
입력 : "pwwkew"
출력 : 3
설명 : 길이가 3, 그래서 "wke"없이 문자를 반복 가장 긴 하위 문자열이 있기 때문에.
"pwke은"서브 순서가 아니라 문자열입니다 당신의 대답은 길이의 문자열이어야 참고하시기 바랍니다.
아이디어 : 슬라이딩 윈도우를 사용하고 문자 K를 찾기 위해 반복되는 첫 번째 문자에서 후방으로보기 시작, 오른쪽으로 이동 때까지 문자를 모두 폐기 (K 포함), 다음 MAXLEN 크기를 업데이트 이전의 문자열 K.
세부 관심 파이썬 코드 구현 :( 길이)
def lengthOfLongestSubstring(s: str) -> int:
i=1 #当前字符的位置
begin=0
maxlen=0
dropedlen=0#记录舍去的字符串的长度
if len(s)==0:
return 0
if len(s)==1:
return 1
for i in range(len(s)):
if s[i] in s[begin:i]:
# 先更新maxlen
templ=len(s[begin:i])
print("s[i]="+s[i])
print("字串="+s[begin:i])
print("templ = "+str(templ))
maxlen=templ if(templ>maxlen) else maxlen
# 舍去字串s[begin:i]中s[i]字符及前面的字符
# 直接用s[begin:i].index(s[i])获得的是相对位置,不是在s中的位置,应该加上dropedlen
relativelen=s[begin:i].index(s[i])#重复的字符串的相对位置
begin=relativelen+dropedlen+1
dropedlen=begin#更新删除的长度
# 到字符串末再更新一次maxlen
templ=len(s[begin:i])+1
maxlen=templ if(templ>maxlen) else maxlen
return maxlen
s = "au"
print("答案:"+str(lengthOfLongestSubstring(s)))