【LeetCode】340.至多包含 K 個不同字元的最長子串
阿新 • • 發佈:2022-04-11
340.至多包含 K 個不同字元的最長子串
知識點:字串;滑動視窗
題目描述
給定一個字串 s ,找出 至多 包含k個不同字元的最長子串 t 。
示例
示例 1:
輸入: s = "eceba", k = 2
輸出: 3
解釋: 則 T 為 "ece",所以長度為 3。
示例 2:
輸入: s = "aa", k = 1
輸出: 2
解釋: 則 T 為 "aa",所以長度為 2。
。
解法一:滑動視窗
這其實也是滑動視窗的一道典型題目
剛看題目,最長子串,其實應該自然的想到滑動視窗。 最大,往往都是right向右移動尋找最優解,然後破壞了條件,然後left移動,縮小視窗,繼續形成可行解;
對應到這道題目:
1.right右移,試圖尋找一個最長視窗,直至破壞了條件,也就是包含了大於k個字元
步驟一我們需要在視窗內含有第三個字元的時候停下來,自然想到了雜湊表,當雜湊表長度為3的時候,證明第k+1個字元出現了
這時候就需要去移動左視窗了
2.left開始移動,縮小視窗
left移動到哪個位置呢?我們的目的是讓left移動後窗口重新滿足條件,也就是隻有k個字元,
所以需要把一個字元移出去,也就是移到索引最小的位置+1處
例如例1,需要移動到c後面,而不能移動到第2個e後面,所以雜湊表的value值應該是字元c最後一次出現的索引,
而我們要的就是找到這兩個字元誰的索引小,所以可以直接對其value形成的list進行排序,取第一個即可。
在這個過程中不斷的更新最大視窗值
class resolution: def getKlongestsubstr(self, s, k): left = 0 maxlen = 0 hashtable = {} for i, cur_str in enumerate(s): hashtable[cur_str] = i if len(hashtable) > k: index = sorted(hashtable.values())[0] # 移出去最左邊的元素 hashtable.pop(s[index]) #刪除指定鍵的值 left = index + 1 maxlen = max(maxlen, i-left+1) return maxlen