日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

[LeetCode]题解(python):076-Minimum Window Substring

發布時間:2025/3/20 python 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [LeetCode]题解(python):076-Minimum Window Substring 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目來源:

  https://leetcode.com/problems/minimum-window-substring/


?

題意分析:

  給定兩個字符串S和T。在S中找到最短的一個子字符串使得他包括所有的T。比如:S?=?"ADOBECODEBANC",T?=?"ABC",那么返回"BANC"。要求時間復雜度O(n)。


?

題目分析:

  利用字典記錄T中每個字符出現的次數。①在S中找到最開始包括所有T中字符的一個結果,并且使得這個結果的第一個字符是T中的。也就是先找到一個滿足答案。上題例子就是找到了"ADOBEC",更新目前的答案,使得當前答案中沒有更短的字符串滿足,也就是說,如果上題找到的滿足是"AADOBEC"的話,要更新為"ADOBEC",記錄當前的長度和當前答案。②然后去掉第一個字符,然后往后更新,直到再次找到滿足的答案,接著更新答案,比較和第一個的長度,如果是比第一個更短,更新長度和答案。③重復②的動作,直到找到了S中的末尾。


?

代碼(Python):

  

1 class Solution(object): 2 def minWindow(self, s, t): 3 """ 4 :type s: str 5 :type t: str 6 :rtype: str 7 """ 8 m,n = len(s),len(t) 9 if m == 0 or n == 0: 10 return "" 11 dn,dm = {},{} 12 for i in t: 13 if i in dn: 14 dn[i] += 1 15 else: 16 dn[i] = 1 17 i,first,last,mark,mark1 = 0,0,0,True,False 18 count = 0 19 while i < m: 20 if s[i] in dn: 21 if mark: 22 first,mark = i,False 23 if s[i] in dm: 24 dm[s[i]]+=1 25 else: 26 dm[s[i]] = 1 27 if dm[s[i]] <= dn[s[i]]: 28 count += 1 29 if count == n: 30 mark1 = True 31 last = i;break 32 i += 1 33 if not mark1: 34 return "" 35 t = first 36 while t < m: 37 if s[t] in dm: 38 if dm[s[t]] == dn[s[t]]: 39 first = t;break 40 else: 41 dm[s[t]] -= 1 42 t += 1 43 ans = [first,last] 44 while True: 45 j,k = first + 1,last + 1 46 tmp = s[first] 47 while j < m: 48 if s[j] in dn: 49 if dm[s[j]] <= dn[s[j]]: 50 first = j;break 51 else: 52 dm[s[j]] -= 1 53 j += 1 54 while k < m: 55 if s[k] == tmp: 56 last,t = k,first 57 while t < m: 58 if s[t] in dm: 59 if dm[s[t]] == dn[s[t]]: 60 first = t;break 61 else: 62 dm[s[t]] -= 1 63 t += 1 64 if last - first <= ans[1] - ans[0]: 65 ans = [first,last] 66 break 67 if s[k] in dm: 68 dm[s[k]] += 1 69 k += 1 70 if k == m: 71 break 72 return s[ans[0]:ans[1]+1] 73 View Code

?


?

轉載請注明出處:http://www.cnblogs.com/chruny/p/5088501.html

轉載于:https://www.cnblogs.com/chruny/p/5088501.html

總結

以上是生活随笔為你收集整理的[LeetCode]题解(python):076-Minimum Window Substring的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。