leetcode 76 最小覆盖子串 哈希表法 c++

给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"

说明:

  • 如果 S 中不存这样的子串,则返回空字符串 ""
  • 如果 S 中存在这样的子串,我们保证它是唯一的答案。

分析:对于s,t分别创建两个表,存储其中字母出现的次数,在s中寻找,并比较两个表,如果t中的每个字母在s都存在一次,则更新最小长度的值。遍历完成后返回最小的长度。

class Solution {
public:
    bool is_window_ok(int map_s[],int map_t[],vector&vec_t){
        for(int i=0;ivec_t;
        for(int i=0;i0){
                vec_t.push_back(i);//在向量中存入出现的字母数值
            }
        }
        int begin=0;
        string result="";
        for(int i=0;imap_t[ch]){//如果遍历到t中包含的字母且第二次出现
                    map_s[ch]--;//且出现的次数减一
                    begin++;//头节点越过
                }
                else//两种情况都不是,则不进行while循环,取比较是否是包含t的子集
                {
                    break;
                }
            }
            if(is_window_ok(map_s,map_t,vec_t)){//是包含的子集
                int len=i-begin+1;//计算当前段的长度
                if(result==""||result.length()>len){
                    result=s.substr(begin,len);//更新最小串
                }
            }
        }
        return result;
    }

};

 

你可能感兴趣的:(编程题,算法题,哈希表)