Minimum Window Substring

来源:互联网 发布:拍网络电影多少钱 编辑:程序博客网 时间:2024/05/20 03:40

窗口子字符串的一般处理方法是用两个指针夹住子字符串,然后移动遍历,暴力搜索

class Solution {public:string minWindow(string S, string T) {vector<int> srcHash(255,0);// 记录目标字符串每个字母出现次数for (int i = 0; i < T.length(); i++) {srcHash[T[i]]++;}int start = 0, i = 0;// 用于记录窗口内每个字母出现次数 vector<int> destHash(255);int found = 0;int begin = -1, end = S.length(), minLength = S.length();for (start = i = 0; i < S.length(); i++) {// 每来一个字符给它的出现次数加1destHash[S[i]]++;// 如果加1后这个字符的数量不超过目标串中该字符的数量,则找到了一个匹配字符if (destHash[S[i]] <= srcHash[S[i]]) found++;// 如果找到的匹配字符数等于目标串长度,说明找到了一个符合要求的子串    if (found == T.length()) {// 将开头没用的都跳过,没用是指该字符出现次数超过了目标串中出现的次数,并把它们出现次数都减1while (start < i && destHash[S[start]] > srcHash[S[start]]) {destHash[S[start]]--;start++;}// 这时候start指向该子串开头的字母,判断该子串长度if (i - start < minLength) {minLength = i - start;begin = start;end = i;}// 把开头的这个匹配字符跳过,并将匹配字符数减1destHash[S[start]]--;found--;// 子串起始位置加1,我们开始看下一个子串了start++;}}// 如果begin没有修改过,返回空return begin == -1 ? "" : S.substr(begin, end + 1 - begin);}};


0 0
原创粉丝点击