lintcode32 最小子串覆盖

1、t[256] 记录 target字符串每个字符出现的次数;
2、int start, i;
i首先遍历source,遍历到从 start 到 i 的子串包含 target ;是否包含根据两个数组间的值来判断找到的字符数量,来判断是否包含。
然后从start开始遍历,去除无用的字符。
用变量begin、end保存当前start 到 i的字符串。

start后移一位,此时一定不满足包含条件,再后移 i 找到新的符合条件的字符串。
参考:https://blog.csdn.net/u012156116/article/details/80648698

class Solution {
public:
   /**
    * @param source : A string
    * @param target: A string
    * @return: A string denote the minimum window, return "" if there is no such a string
    */
   string minWindow(string &source , string &target) {
       // write your code here
       int *t = new int[256]();
       
       for(int i = 0;i < target.length();i++){
           t[target[i]]++;
       }
       
       int *s = new int[256]();
       int found = 0;                    //找到的字符数量
       int start = 0;
       int begin = 1,end = 0;
       int len  = source.length()+1;
       
       for(int i = 0;i < source.length();i++){
           s[source[i]]++;
           if(s[source[i]] <= t[source[i]]) //target中没有的为0,存在的话,source取到一次就加1。
           {
               found++;
           }
           if(found == target.length()){
               while(start < i && s[source[start]] > t[source[start]]){
                   s[source[start]]--;
                   start++;
               }                         //去除前面多余的字符
               
               if(i-start+1 < len){
                   begin = start;
                   end  = i;
                   len = i - start + 1;
               }
               start++;                  //将start后移 寻找其他子串
               found--;                  //后移后 肯定不再满足条件
           }
       }
       if(begin > end){
           return "";                    //对应一个子串也没找到的情况
       }
       string res = source.substr(begin,end-begin+1);
       return res;
   }
};

你可能感兴趣的:(lintcode32 最小子串覆盖)