【python-leetcode340-滑動窗口法】至多包含 K 個不同字符的最長子串


問題描述:給定一個字符串s,找到至多包含k個不同字符得最長子串的長度。

比如s="cebea",k=2,那么輸出結果就是3,因為此時"ebe"滿足條件:至多包含兩個不同字符,且子串最長

比如s="world",k=4,那么輸出結果就是4,因為"worl"和"orld"滿足條件:至多包含4個不同字符,且子串最長

class Solution:
    def lengthOfLongestSubstringKDistinct(self, s, k):
        tmp = 0 #用於記錄滿足條件得最大值
        for i in range(1,len(s)+1):#步長從1到len(s)+1
            for j in range(len(s)-i+1):#窗口左端
                print(s[j:j+i])
                if len(set(s[j:j+i])) == k:#如果窗口中取集合后的不同字符就是k個
                    tmp = max(tmp,i)#更新tmp的值
                    print("tmp:{}".format(tmp))
        return tmp #最后返回即可

過程:

c
e
b
e
a
ce
tmp:2
eb
tmp:2
be
tmp:2
ea
tmp:2
ceb
ebe
tmp:3
bea
cebe
ebea
cebea

第二種方法:

思路: 一個hash表和一個左邊界標記. 遍歷字符串將其加入到hash表中, 不同字符多於k個了, 就從左邊開始刪字符. 直到hash表不同字符長度等於k.此時字符串的長度就是當前字符和左邊界的距離。
class Solution:
    def lengthOfLongestSubstringKDistinct(self,s,k):
        from collections import defaultdict
        #使用python中的collections.defaultdict
        #字典中存儲的整型的值默認為0
        hash = defaultdict(int)
        max_num = 0 #用於存放最大值
        start = 0 #滑動窗口的左端
        #從字符串左開始遍歷
        for i in range(len(s)):
            #遍歷到一個字符,使得字典中對應得字符加1
            hash[s[i]] += 1
            while len(hash)>k:
                hash[s[start]] -= 1
                if hash[s[start]] == 0:
                    del hash[s[start]]
                start += 1
            max_num = max(max_num,i-start+1)
        return max_num

 由於leetcode沒會員,不能解鎖,不能保證能過。但思路應該沒問題。


免責聲明!

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



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