問題描述:給定一個字符串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沒會員,不能解鎖,不能保證能過。但思路應該沒問題。