题解 | #最小覆盖子串#

最小覆盖子串

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

  1. 典型的滑动窗口问题
class Solution {
public:
    /**
     * 
     * @param S string字符串 
     * @param T string字符串 
     * @return string字符串
     */
    string minWindow(string S, string T) {
        // write code here
        unordered_map<char,int> need, window;
        //首先,初始化 window 和 need 两个哈希表,记录窗口中的字符和需要凑齐的字符:
        for(char c:T){
            need[c]++;
        }
        //然后,使用 left 和 right 变量初始化窗口的两端,不要忘了,区间 [left, right) 是左闭右开的,所以初始情况下窗口没有包含任何元素:
        int left = 0,right = 0;
        int valid = 0;//其中 valid 变量表示窗口中满足 need 条件的字符个数,如果 valid 和 need.size 的大小相同,则说明窗口已满足条件,已经完全覆盖了串 T。

        //开始滑动
        //记录最小覆盖子串的起始索引及长度
        int start = 0, len = INT_MAX;
        while(right<S.size()){
             // c 是将移入窗口的字符
            char c = S[right];
            // 右移窗口
            right++;
             // 进行窗口内数据的一系列更新
            if(need.count(c)){
                window[c]++;
                if(window[c]==need[c]){
                    valid++;
                }
            }

            // 判断左侧窗口是否要收缩
            while(valid==need.size()){
                 // 在这里更新最小覆盖子串
                if(right-left<len){
                    start = left;
                    len = right - left;
                }
                //  d 是将移出窗口的字符
                char d = S[left];
                // 左移窗口
                left++;
                // 进行窗口内数据的一系列更新
                if(need.count(d)){
                    if(window[d] == need[d]){
                        valid--;
                    }

                    window[d]--;
                }


            }


        }


        return len == INT_MAX? "": S.substr(start,len);


    }
};
算法解析 文章被收录于专栏

这里主要是算法岗的自我思路总结

全部评论

相关推荐

10-22 12:03
山东大学 Java
程序员小白条:26届一般都得有实习,项目可以随便写的,如果不是开源社区的项目,随便包装,技术栈也是一样,所以本质应该找学历厂,多投投央国企和银行,技术要求稍微低一点的,或者国企控股那种,纯互联网一般都得要干活
应届生简历当中,HR最关...
点赞 评论 收藏
分享
12-03 03:32
安徽大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务