IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【滑动窗口】最小覆盖子串 -> 正文阅读

[C++知识库]【滑动窗口】最小覆盖子串

练题呀练题

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

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”

链接:https://leetcode-cn.com/problems/minimum-window-substring

在这里插入代码片/**
 * 滑动窗口
 */
class Solution {
        public static String minWindow(String s, String t) {
            //类似于字典,使用一个一维数组need[]以ASCII码作为索引管理相应字符数目
            int[] need = new int[128];
            for (int i = 0; i < t.length(); i++)//将t中已有的元素在need中记录数量
                need[t.charAt(i)]++;

            int count = t.length();//定义一个整型变量用于记录窗口所需要的进入的t的元素数量
            int size = Integer.MAX_VALUE;//用于记录窗口的最小长度,记得更新
            int start = 0;//用于记录求得最短窗口的开始下标
            int l = 0,r = 0;//窗口左右边界

            while (r < s.length())//右边界不小于字符串s长
            {
                char c = s.charAt(r);//窗口右边界移动到的字符
                if (need[c] > 0)//表示t中相应元素还未全在窗口中
                    count--;//将该元素吞进窗口,还需要进窗口的元素数目减1
                need[c]--;//进窗口的字符元素数目在need中减1


                if (count == 0)//此时所需字符已经全部进入窗口
                {
                    //此时左边界不一定是所需要的字符
                    // 不要少了左边界需要小于右边界的条件,一开始我写的条件是(l < r && s.charAt(l) != t.charAt(0))
                    //但显然,就算是需要的t中的字符也可能在我们的窗口中多余,应该修改条件
                    while (l < r && need[s.charAt(l)] < 0){
                        need[s.charAt(l++)]++;//是多余字符时把其踢出窗口使对应need数组元素值加1并使左边界右移一位
                    }
                    //需要看看是否需要更新字典
                    if (r - l + 1 < size)
                    {
                        size = r - l + 1;
                    //更新目前最短窗口的下标
                        start = l;
                    }//一开始少写了大括号导致错误!!!
                    //使左边界继续向右移动,看是否能有更短的窗口,别忘了将对应need与count加1
                    need[s.charAt(l++)]++;
                    count++;
                }
                r++;//写while时先放在程序里,需要修改时修改
            }
            return size == Integer.MAX_VALUE ? "": s.substring(start,start+size);
        }
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 18:45:28  更:2022-01-30 18:45:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:39:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码