题解 | #最小覆盖子串#

最小覆盖子串

http://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac

最小覆盖子串

1、题意重述

给出两个字符串 s 和 t,要求在 s 中找出最短的包含 t 中所有字符的连续子串。

换句话说,即在字符串s中找一个最短子串,这个子串里面包含了t字符串中的所有字符。

2、思路整理

使用双指针的思想:

Step1:用两个指针left,right分别指向字符串s的开头,然后将right进行右移,直到[s[left],s[right]]区间内包含了t字符串的所有字符,同时对子串进行记录。

alt

Step2:将left进行右移,直到[s[left],s[right]]区间内不含t字符串的所有字符。

alt

Step3:将right进行右移,直到[s[left],s[right]]区间包含t字符串的所有字符,并对子串进行记录。

Step4:重复step2和step3的操作。

Step5:直到right指针移出s字符串,并返回最小长度的子串。

alt

3、代码实现

public static String minWindow(String s, String t) {
        if (s == null || s == "" || t == null || t == "" || s.length() < t.length()) {
            return "";
        }
        //用来统计每个字符出现次数
        int[] ns = new int[128];
        //用来统计滑动窗口中每个字符出现次数
        int[] w = new int[128];

        for (int i = 0; i < t.length(); i++) {
            ns[t.charAt(i)]++;
        }

        int left = 0;
        int right = 0;

        String res = "";

        int count = 0;

        //用来记录最短需要多少个字符。
        int minLength = s.length() + 1;

        while (right < s.length()) {
            char ch = s.charAt(right);
            w[ch]++;
            if (ns[ch] > 0 && ns[ch] >= w[ch]) {
                count++;
            }

            //移动到不满足条件为止
            while (count == t.length()) {
                ch = s.charAt(left);
                if (ns[ch] > 0 && ns[ch] >= w[ch]) {
                    count--;
                }
                if (right - left + 1 < minLength) {
                    minLength = right - left + 1;
                    res = s.substring(left, right + 1);

                }
                w[ch]--;
                left++;

            }
            right++;

        }
        return res;
    }

4、复杂度分析

时间复杂度:一层循环,因此时间复杂度为O(N)O(N)

空间复杂度:常数级内存地址空间,因此空间复杂度为O(1)O(1)

22年春节特别专栏_双指针 文章被收录于专栏

双指针题解,图片随便找的!

全部评论

相关推荐

想要offer的牛油果很大方:老哥,你啥时候面的,有timeline吗
点赞 评论 收藏
分享
2024-12-27 23:45
已编辑
三江学院 Java
程序员牛肉:死局。学历+无实习+项目比较简单一点。基本就代表失业了。 尤其是项目,功能点实在是太假了。而且提问点也很少。第一个项目中的使用jwt和threadlocal也可以作为亮点写出来嘛?第二个项目中的“后端使用restful风格”,“前端采用vue.JS”,“使用redis”也可以作为亮点嘛? 项目实在是太简单了,基本就是1+1=2的水平。而你目标投递的肯定也是小厂,可小厂哪里有什么培养制度,由于成本的问题,人家更希望你来能直接干活,所以你投小厂也很难投。基本就是死局,也不一定非要走后端这条路。可以再学一学后端之后走测试或者前端。 除此之外,不要相信任何付费改简历的。你这份简历没有改的必要了,先沉淀沉淀
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务