76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。

示例 2:

输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。

示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • s 和 t 由英文字母组成

进阶:你能设计一个在 o(m+n) 时间内解决此问题的算法吗?

 

string minWindow(string s, string t) {

    vectorsVec(62, 0);//现有
    vectortVec(62, 0);//目标

    for (int i = 0; i     {
        tVec[t[i] - 65]++;
    }
    string ret = s;
    int left = 0;
    int right = 0;
    string tmp = "";
    while (left <= right && right     {
        sVec[s[right] - 65]++;
        if (tVec[s[right] - 65] > 0  && sVec[s[right] - 65] >= tVec[s[right] - 65])
        {
            //判断是否存在目标子串
            bool bfind = true;
            for (int i = 0; i<62; i++)
            {
                if (tVec[i]>sVec[i])
                {
                    bfind = false;
                    break;
                }
            }
            //存在目标子串,开始从左边缩小
            if (true == bfind)
            {
                while (left                 {
                    if (tVec[s[left] - 65] == 0)
                    {
                        sVec[s[left] - 65]--;
                        left++;
                        continue;
                    }
                    if (sVec[s[left] - 65] > tVec[s[left] - 65])
                    {
                        sVec[s[left] - 65]--;
                        left++;
                        continue;
                    }
                    break;
                }
                tmp = s.substr(left, right - left + 1);
                if (tmp.length() < ret.length())
                {
                    ret = tmp;
                }
            }
        }
        right++;
    }
    if ("" == tmp)
    {
        return "";
    }

    return ret;

}

你可能感兴趣的:(java,算法,javascript)