力扣刷题-热题100题-第12题(c++、python)

76. 最小覆盖子串 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-window-substring/?envType=study-plan-v2&envId=top-100-liked

c++是力扣官网评论区大佬的76. 最小覆盖子串 - 力扣(LeetCode)76. 最小覆盖子串 - 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 注意: * 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 * 如果 s 中存在这样的子串,我们保证它是唯一的答案。 示例 1:输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。示例 2:输入:s = "a", t = "a"输出:"a"解释:整个字符串 s 是最小覆盖子串。示例 3:输入: s = "a", t = "aa"输出: ""解释: t 中两个字符 'a' 均应包含在 s 的子串中,因此没有符合条件的子字符串,返回空字符串。 提示: * m == s.length * n == t.length * 1 <= m, n <= 105 * s 和 t 由英文字母组成 进阶:你能设计一个在 o(m+n) 时间内解决此问题的算法吗?https://leetcode.cn/problems/minimum-window-substring/solutions/257359/zui-xiao-fu-gai-zi-chuan-by-leetcode-solution/comments/2473407/

python是

76. 最小覆盖子串(困难)_双指针 python 最小覆盖子串-CSDN博客https://blog.csdn.net/weixin_38979465/article/details/139974883?ops_request_misc=%257B%2522request%255Fid%2522%253A%25228b36b2a144bf1c1d6463b3eb9057c185%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=8b36b2a144bf1c1d6463b3eb9057c185&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-14-139974883-null-null.142^v102^pc_search_result_base8&utm_term=%E6%9C%80%E5%B0%8F%E8%A6%86%E7%9B%96%E5%AD%90%E4%B8%B2&spm=1018.2226.3001.4187主要就是双指针,在遍历数组过程中看左右指针包括的子数组是否包含要求子串的所有字符

固定左指针,移动右指针,直到左右指针包括子串所有字符;然后记录下左右指针这一串字符(c++)和左右指针的坐标(python)

再移动左指针,重复上面步骤,直至找到最小的覆盖子串

两个语言比较左右指针中的子串与要求子串,都是以一个变量来记录s字符串中与t字符串重合的字符个数来的,当这个变量大小就是t字符串长度时就是找到了。

在c++中直接以空间换时间,以字符的asc码来进行计数,也没有管字母表啊之类的,直接123个asc码,对s与t中的字符进行计数;当遍历到字符时,s对应的+1,然后比较,若s中小于等于t中的时,就代表这遍历的是t中有的,重合了,计数+1;直到s中的左指针的字符比t中的还多时,左指针右移;当计数有t字符串那么大时,就看是不是最小的覆盖子串了;最后遍历完输出。

在python中是以时间空间都比较平衡的方式,以一个Counter的数据类型tc对t中字符进行统计,然后对s进行遍历,在遍历中对tc进行操作也进行重合字符的计数,当s中字符在tc中时,相应字符数量-1,但重合计数+1,且把这个位置放到数组index中,直到重合数量有t那么大,取出index的第一个元素作为左指针位置(这样左指针不用累加的操作,直接以位置数组的第一个元素赋值),来看左右指针长度,若更小就替换,且右指针右移

//c++
class Solution {
public:
    string minWindow(string s, string t) 
    {
        int hs[123],ht[123];
        int count=0;
        string res;
        for(auto c:t) ht[c]++;
        for(int y=0,z=0;yht[s[z]])
            {
                hs[s[z]]--;
                z++;
            }
            if(count==t.size())
                if(res.empty()||y-z+1 str:
        tc=Counter(t)
        z,y,n=0,0,len(t)
        res=[0,-1,len(s)+1]
        cnt=0
        indexs=[]
        pre=-1
        while y=0:
                    cnt=cnt+1
                indexs.append(y)
            while cnt==n and len(indexs)>0:
                pre=pre+1
                z=indexs[pre]
                if y-z+1=0:
                    cnt=cnt-1
                tc[s[z]]=tc[s[z]]+1
            y=y+1
        return s[res[0]:res[1]+1]

你可能感兴趣的:(leetcode,c++,算法,python)