leetcode-76-Minimum Window Substring

吃透题目:

任何问题的解决在于理解题目,挖掘本质。 
这道题目,从一个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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值