【一天一道LeetCode】#76. Minimum Window Substring
一天一道LeetCode
本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github
欢迎大家关注我的新浪微博,我的新浪微博
欢迎转载,转载请注明出处
(一)题目
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = “ADOBECODEBANC”
T = “ABC”Minimum window is “BANC”.
Note:
If there is no such window in S that covers all characters in T, return the empty string “”.If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
(二)解题
题目大意:给定两个字符串S和T,求S中的包含T中所有字符的最小子串。
博主内心os:hard的题为什么每次都这么难做!
下面分享一下解题思路:
准备工作
遇到这种求子串的题目,不难想到要用到两个指针start和end记录子串在S中的开始和结束序号。
另外,本题还需要用到哈希的思想,故使用两个数组needFind[256]和find[256],前者用来记录我们需要找的字母及其出现次数,后来用来记录当前找到的字母及其出现次数。数组大小为256是因为字符ascii值在0~256之间。
那么,接下来,我们需要判断什么时候确定找到了一个子串包含T中的所有字符呢?
这里我们定义一个整形数count来记录“有效字符数”。那又有问题了,什么是有效字符?
假设T中有1个字符A,当我们找到第一个的时候count++,当我们找到第二个的时候超过了我们需要找的,故为无效字符,count不变。
又回到上一个问题,count等于T的长度的时候,就确定找到了一个子串包含T中的所有字符。
算法过程
做好如上的准备之后,就是整个算法的思想:
用[start,end]来标记窗口的起始位置,end一直向后扩张,并且find[]不停的记录已找到的字符及其出现的次数,count一直记录有效字符数。
当count等于字符串T的长度时,表示找到了符合要求的子串,这时,就需要对begin进行处理了。
- 当S[begin]为不需要找的字符时,需要去除。如S=“CDAB”,T=“AB”,这时CD就需要去除
- 当S[begin]需要找的字符,但超过了需要找的次数。如S=“AAB”,T=”AB”,这时A就需要去除
这样就找到了当前窗口下的最小子串,然后end继续向后扩张,重复如上步骤。
简而言之就是,扩张收缩在扩张在收缩……
具体的算法请看下面代码:
class Solution {
public:
string minWindow(string s, string t) {
int needFind[256] = {0};//记录需要找的字符及其出现次数
int find[256] = {0};//记录找到的字符及其出现次数
int count = 0;//记录有效字符数
int begin=0,end=0;//记录当前窗口的起始位置和结束为止
int minbegin = 0 , minlen = 2147483647;//记录最小窗口及其大小
for(int i = 0 ; i < t.size() ; i++) needFind[t[i]]++;//初始化需要找的字符及其需要出现的次数
for(;end<s.length();end++)
{
if(needFind[s[end]]==0) continue;//如果不是需要找的字符就继续下一个
find[s[end]]++;//找到的需要找的字符,其次数加1
if(find[s[end]]<=needFind[s[end]]) count++;.//如果找到的字符的次数小于或等于需要找的次数,则记为有效字符
if(count==t.length())//找到了包含T中所有字符的子串
{
while(begin<end) {//去除窗口前面的无效字符
if(needFind[s[begin]]==0) begin++;//不需要找的字符去除
else if(find[s[begin]] > needFind[s[begin]])//超过次数的字符去除
{
find[s[begin]]--;//去除后次数减1
begin++;
}
else break;
}
int templen = end-begin+1;//计算当前窗口的长度
if(minlen>templen)
{
minlen = templen;
minbegin = begin;
}
}
}
return minlen == 2147483647 ?"":s.substr(minbegin,minlen);如果没有找到就返回“”,反之返回找到的子串
}
};
【一天一道LeetCode】#76. Minimum Window Substring的更多相关文章
- [LeetCode] 76. Minimum Window Substring 最小窗口子串
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- [LeetCode] 76. Minimum Window Substring 解题思路
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- [leetcode]76. Minimum Window Substring最小字符串窗口
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- Leetcode#76 Minimum Window Substring
原题地址 用两个指针分别记录窗口的左右边界,移动指针时忽略那些出现在S种但是没有出现在T中的字符 1. 扩展窗口.向右移动右指针,当窗口内的字符即将多于T内的字符时,停止右移 2. 收缩窗口.向右调整 ...
- 刷题76. Minimum Window Substring
一.题目说明 题目76. Minimum Window Substring,求字符串S中最小连续字符串,包括字符串T中的所有字符,复杂度要求是O(n).难度是Hard! 二.我的解答 先说我的思路: ...
- 【LeetCode】76. Minimum Window Substring
Minimum Window Substring Given a string S and a string T, find the minimum window in S which will co ...
- 【LeetCode】76. Minimum Window Substring 最小覆盖子串(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 日期 题目地址: https://leet ...
- 76. Minimum Window Substring
题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...
- [Leetcode][JAVA] Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
随机推荐
- 解读Raft(二 选举和日志复制)
Leader election Raft采用心跳机制来触发Leader选举.Leader周期性的发送心跳(如果有正常的RPC的请求情况下可以不发心跳)包保持自己Leader的角色(避免集群中其他节点认 ...
- Linux shell爬虫实现树洞网自动回复Robot
奇怪的赞数 人生在世,不如意事十之八九,可与言者无二三人.幸好我们生在互联网时代,现实中找不到可以倾诉的人还可以在网络上寻找发情绪宣泄口,树洞这类产品就是提供一个让人在网络上匿名倾诉的平台. 我是偶然 ...
- Docker 备份、恢复、迁移数据卷
可以利用数据卷对其中的数据进行进行备份.恢复和迁移. 备份 首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的 /backup 目录. ...
- 安卓高级9 shareSDK 第三方登陆和分享Mob
ShareSDK推荐此官网地址 官网注册和申请key流程 注册 略 进入后台创建应用得到可以 下载SDK 解压下载的压缩包 第三方平台申请key 如果你想申请QQ登陆或者分享需要去腾讯开发者申请,申请 ...
- Linux 性能监测:IO
磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴.寻轨等.访问硬盘和访问内存之间的速度差别是以数量级来计算的,就 ...
- linux下内存大小、起始地址的解析与修改
在实际的工作中,由于产品型号的不同,经常需要调整linux所管理的内存的大小,而内核在启动阶段,会两次去解析从uboot传递过来的关于内存的信息,具体如下: 一.解析从uboot传递过来的tag(在p ...
- 20160218.CCPP体系详解(0028天)
程序片段(01):加法.c 内容概要:字符串计算表达式 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <st ...
- Dynamics CRM 安装CRM程序系统检查界面报未将对象引用设置到对象的实例的解决方法
今天在安装CRM的时候,在系统检查阶段遇到了如下的错误,咋看之下直接是懵逼的 但不要着急,界面上有两个按钮,一个是详细信息,一个是帮助,详细信息不用看了就那一行字也看不出什么,咱们点下帮助看看,定位到 ...
- 剑指Offer——联通研究院笔、面试题 (Offer已收割)
剑指Offer--联通研究院笔.面试题 1.二叉树适宜存储什么样的数据? 树最适合用来表示( C ). A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 ...
- Android图表库MPAndroidChart(四)——条形图的绘制过程过程,隐隐约约我看到了套路
Android图表库MPAndroidChart(四)--条形图的绘制过程过程,隐隐约约我看到了套路 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库 ...