題目
給定一個字符串,請你找出其中不含有重復字符的最長子串的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。
示例 2:
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重復字符的最長子串是 "b",所以其長度為 1。
示例 3:
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重復字符的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
題目來源: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters)
滑動窗口算法
滑動窗口算法可以用以解決數組/字符串的子元素問題,它可以將嵌套的循環問題,轉換為單循環問題,降低時間復雜度。
窗口可以是固定大小,起始和終止位置同時變化。
也可以是可變大小,起始和終止位置不同時變化。
參考鏈接: https://www.zhihu.com/topic/20746237/intro
思路
利用滑動窗口,從第一個字符開始向后查看,當找到重復字符k時,將字串k(包括k)之前的字符全部舍去,然后更新maxlen的大小,直至移動到結尾。
python代碼實現
(注意獲取長度的細節)
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)))