吃透题目:
任何问题的解决在于理解题目,挖掘本质。
这道题目,从一个string中找包含char的最小子序列,O(n),要求只能遍历一遍。
每次移动一个index,都尝试找子序列,通过对目标子序列统计数目,与当前的char的数目进行合并,然后子循环while的时候,通过减法操作,达到==0的条件时候,就可以知道这是最短的子序列的边界,同理for循环向后迭代。
相似: kmp算法,保持状态,省略不必要的遍历,从上次移动到的位置i,继续向后移动。
逐步逼近法,类似于牛顿迭代法。重点是找到规律,然后将规律加以表示。
动态规划,相邻两个位置之间的关系。
应用:
学会记录状态,没有必要再次重复的位置,通过记录加以过滤。
字符串的叠加,可以增加共性,通过相减可以得到边界位置处符合规律的要求。
学会将问题转化为可求的边界问题。
import collections
class Solution:
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
missing=len(t)
need=collections.Counter(t)
i=I=J=0
# J=len(s)
for j,c in enumerate(s,1):
missing-=need[c]>0
need[c]-=1
if not missing:
# tmp1=s[i]
# tmp3=need[s[i]]
# tmp2=need[s[i]] < 0
while (i<j and need[s[i]]<0):
need[s[i]]+=1
i+=1
if (need[s[i]]>=0 and j-i<=J-I) or J==0:
I=i
J=j
# print('I,J==>',I,J)
return s[I:J]
if __name__=='__main__':
S = "ADOBEBCBODEBBANNNNACB"
T = "ABC"
S='ab'
T='a'
# S='a'
# T='aa'
st=Solution()
out=st.minWindow(S,T)
print('out==>',out)