zoukankan      html  css  js  c++  java
  • 76. 最小覆盖子串 Leetcode Python 滑动窗口解法

    题目:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

    注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。

    示例 1:

    输入:s = "ADOBECODEBANC", t = "ABC"
    输出:"BANC"
    示例 2:

    输入:s = "a", t = "a"
    输出:"a"
     

    提示:

    1 <= s.length, t.length <= 105
    s 和 t 由英文字母组成

    题解代码:

    class Solution:
        def minWindow(self, s: str, t: str) -> str:
            need = {}   # t 中字符个数转化为dict
            window = {}   # 记录窗口数据
    
            # 初始化需要的结果字典
            for i in t:
                if  i in need:
                    need[i]+= 1
                else:
                    need[i] = 1
    
            left,right = 0,0 # 两个指针
            valid = 0  # 记录有多少个符合t字符串的字符进入到了窗口中
    
            start,lenght = 0 , float("inf") # 初始化结果, start 表示字串开始,lenght表示最短子串个数
            while(right<len(s)):
                s_str = s[right]
                right += 1
                if s_str not in window:
                    window[s_str] = 1
                else:
                    window[s_str] += 1
                if s_str in  need:
                    if window[s_str] == need[s_str]: # windows 中记录的个数与need 中记录的个数相等,说明这个字符已经满足条件
                        valid += 1 
               
                # 当valid == len(need) 之后开始left 开始右移动,减小窗口
                while (valid == len(need)):
                  
                    if  right - left < lenght : # 记录字串起始位置与长度
                        start = left
                        lenght = right - left
                        
                    d = s[left];
                    left+=1   # left 右移
                    if d in need:
                        if (window[d] == need[d]):  # 如果移出去的字符刚好符合need 则left 右移后字串不符合条件。
                            valid -=1
                        window[d] -= 1 # 在窗口中将移出去的字符数减1
          
            return ""  if lenght == float("inf") else s[start:lenght+start]
    
                    
  • 相关阅读:
    第4天--linux内核学习
    make menuconfig出错,需要安装libncurses5-dev找不到文件的终极解决办法(不必更换源,适用于ubuntu 32位平台)
    uboot学习第一天
    与或左移右移操作在ARM寄存器配置中的作用
    第四天网络编程笔记
    socket编程热身程序
    线程的创建pthread_create.c
    json.dumps与json.dump的区别 json.loads与json.load的区别
    解决在Vim中鼠标右键不能粘贴
    Python with语句
  • 原文地址:https://www.cnblogs.com/huangguifeng/p/14193704.html
Copyright © 2011-2022 走看看