76. 最小覆盖子串

简介: 76. 最小覆盖子串

题目:

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

注意:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

image.png

具体实现

用 strT[] 当作哈希表,统计字符串 t 中各元素的哈希值,用 lenT 统计还未找到的字符串 t 中字母的个数。
右指针 right 从字符串 s 头移动到字符串 s 尾: s 中每个字母的对应的哈希表 -1,若字符串 s 有字符串 t 的字母(即哈希值被减一之前 >0),则 lenT-- ;
如果出现匹配的子串(即 lenT == 0 ,此时所有 t 中字母对应的哈希值都 ==0,非 t 字母对应的哈希值 <0):更新最小匹配子串的起点 min 和终点 max ,然后 left++ 。不过在 left++ 之前要先更新窗口数据,即先将left的字母的哈希值 +1,如果加一后其值 >0,则这个字母在 t 中存在,所以要 lenT++ 。
当if (max != INT32_MAX) ,找到了最小匹配字串;若未找到最小匹配子串,返回""。

char * minWindow(char * s, char * t){
    int strT[58] = {0};//定义哈希表
    int lenS = strlen(s);
    int lenT = strlen(t);
    for(int i = 0; i < lenT; i++)//初始化哈希表
    {
        strT[t[i] - 'A']++;
    }    
    int min = 0, max = INT_MAX;
    for(int i = 0, j = 0; i < lenS; i++)//遍历字符串
    {
        if(strT[s[i] - 'A']-- > 0)//出现相同元素
        {
            lenT--;
        }
        while(lenT == 0)//维护滑动窗口
        {
            if((i-j) < (max - min))//记录字符串出现位置
            {
                min = j;
                max = i;
            }
            if(++strT[s[j] - 'A'] > 0)
            {
                lenT++;
            }
            j++;
        }
    }
    if(max == INT_MAX)
        return "";
    char * res = malloc(sizeof(char) * (max - min + 2));//保存字符串并输出
    int i = 0;
    while(min <= max)
    {
        res[i++] = s[min++];
    }
    res[i] = '\0';
    return res;
}

相关文章
|
11月前
|
算法 测试技术 C#
C++二分查找算法:查找和最小的 K 对数字
C++二分查找算法:查找和最小的 K 对数字
|
3月前
|
存储 算法 索引
|
3月前
|
算法
【算法】滑动窗口——最小覆盖子串
【算法】滑动窗口——最小覆盖子串
|
3月前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
5月前
leetcode题解:28.找出字符串中第一个匹配项的下标
leetcode题解:28.找出字符串中第一个匹配项的下标
25 0
|
6月前
|
人工智能 自然语言处理 算法
【动态规划】【字符串】【前缀和】1639通过给定词典构造目标字符串的方案数
【动态规划】【字符串】【前缀和】1639通过给定词典构造目标字符串的方案数
|
6月前
|
算法 测试技术 C#
【滑动窗口】【map】LeetCode:76最小覆盖子串
【滑动窗口】【map】LeetCode:76最小覆盖子串
|
算法
LeetCode:28. 找出字符串中第一个匹配项的下标
题目描述:给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
leetcode-76. 最小覆盖子串(滑动窗口)
时间复杂度:最坏情况下左右指针对 s 的每个元素各遍历一遍,哈希表中对 s 中的每个元素各插入、删除一次,对 t 中的元素各插入一次。每次检查是否可行会遍历整个 t 的哈希表,哈希表的大小与字符集的大小有关,设字符集大小为 CC,则渐进时间复杂度为 O(C⋅∣s∣+∣t∣)。
109 0
leetcode-76. 最小覆盖子串(滑动窗口)