python3實現無重復字符的最長子串——滑動窗口算法


題目

給定一個字符串,請你找出其中不含有重復字符的最長子串的長度。

示例 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)))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM