76. 最小覆盖子串

    技术2022-07-10  102

     


     


    class Solution { public: string minWindow(string s, string t) { //左闭右开区间,初始化中,没有元素 int left=0,right=0; unordered_map<char,int>window,need; int valid=0; //start 满足t在s中的条件的起点,len 满足条件的字符串长度 //size()+1 是len永远不会到达的长度,用来作比较 int start=0,len=s.size()+1; //将t字符放入c中 for(char c:t) need[c]++; //right 遍历直到s.size()-1 不然索引会越界 while(right<s.size()) { char c=s[right]; //左闭右开的空间 //right指向下一个元素 right++; if(need.count(c)) { window[c]++; if(window[c]==need[c])valid++; } //t字符串中的字符都找到了,开始缩小窗口, while(valid==need.size()) { //size()+1 是len永远不会到达的长度,用来作比较 //更新包含T所有字符的最小字串 if((right-left)<len) { start=left; len=right-left; } char d=s[left]; //缩小窗口 left++; //缩小窗口,需要更新数据 if(need.count(d)) { //可能当前截取字串中,有重复的t中的字符,BBEAC ABC window中B的数量大于need中B的数量,j即window[d]>need[d]所以只有windwindow[d]--才能到window[d]==need[d]时才valid-- if(window[d]==need[d]) valid--; window[d]--; } } } return len==(s.size()+1)?"":s.substr(start,len); } };

     

    Processed: 0.012, SQL: 9