leecode76. 最小覆盖子串
76. 最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
示例 2:
输入:s = "a", t = "a"
输出:"a"
示例 3:
输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
思路:本题采用滑动窗口的模式来解决,首先如何判断s中是否包含t,我们通过记录t中字符出现的频数(即记录每种字符出现的次数),并且用distance来记录。当窗口中s出现t种含有字符的频数小于t的频数时distance++,为什么是小于,那是因为distance是用来判断窗口中是否满足包含完整的t,窗口中只要满足就进行下一步找最小的,此时没有到找最下的这一步,一次允许存在窗口中允许大于t种某类或者某几类字符的存在,加入s= "ABABABBAACC"而t = "ABC",那么s第一次满足涵盖t的就应该是"ABABABBAAC"之后我们在去对这个进行窗口缩小。窗口缩小的结束条件为distance != tLength,那distance什么时候变化,当窗口中含有的t的字符任意某个 = t的出现的次数 ,"ABABABBAAC"的最小就应该是BAAC
思路种有两个关键点:1.窗口首先一直向右扩大,那什么时候停止?2.窗口停止后我们需要找到最小覆盖,什么时候是最小覆盖
问题一:当窗口右侧一直右移扩大时第一个满足覆盖时停止
问题二:当窗口左侧一直右移缩小时(窗口大小为右侧-左侧),最后一个满足覆盖
代码如下:
class Solution {
public String minWindow(String s, String t) {
int sLength = s.length();
int tLength = t.length();
if(tLength>sLength||tLength==0||sLength==0){
return "";
}
char[] charArrayS = s.toCharArray();
char[] charArrayT = t.toCharArray();
char[] tFreq = new char[128];
char[] winFreq = new char[128];
for(char c : charArrayT){
tFreq[c]++;
}
int left = 0;
int right = 0;
int distance = 0;
int mLen = sLength+1;
int begin = 0;
while(right < sLength){
if(tFreq[charArrayS[right]] == 0){
right++;
continue;
}
if(winFreq[charArrayS[right]]<tFreq[charArrayS[right]]){
distance++;
}
winFreq[charArrayS[right]]++;
right++;
while(distance == tLength){
if(right-left<mLen){
mLen = right-left;
begin =left;
}
if(tFreq[charArrayS[left]] == 0){
left++;
continue;
}
if(winFreq[charArrayS[left]]==tFreq[charArrayS[left]]){
distance--;
}
winFreq[charArrayS[left]]--;
left++;
}
}
return mLen == sLength+1 ? "" : s.substring(begin,begin+mLen);
}
}
leecode76. 最小覆盖子串的更多相关文章
- POJ2185Milking Grid(最小覆盖子串 + 二维KMP)
题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形 关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/686 ...
- KMP算法 - 求最小覆盖子串
KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...
- 【1】【leetcode-76】 最小覆盖子串
最小覆盖子串(hard) (不会) 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", ...
- Milking Grid POJ - 2185 || 最小覆盖子串
Milking Grid POJ - 2185 最小覆盖子串: 最小覆盖子串(串尾多一小段时,用前缀覆盖)长度为n-next[n](n-pre[n]),n为串长. 当n%(n-next[n])==0时 ...
- Leetcode 76.最小覆盖子串
最小覆盖子串 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "A ...
- 【t011】最小覆盖子串
Time Limit: 1 second Memory Limit: 32 MB [问题描述] 给定一个含有N个元素的序列A,你的任务就是求出序列A的最小覆盖子串的长度. 本题中的一些定义: 串S,是 ...
- [LeetCode] 76. 最小覆盖子串 ☆☆☆☆☆(滑动窗口)
https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong- ...
- Java实现 LeetCode 76 最小覆盖子串
76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = ...
- [LeetCode]438. 找到字符串中所有字母异位词、76. 最小覆盖子串(滑动窗口解决子串问题系列)
题目438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 说明: 字母异位词指字母相同,但排列不同的字符 ...
- 【LeetCode】76. 最小覆盖子串
76. 最小覆盖子串 知识点:字符串:滑动窗口 题目描述 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ...
随机推荐
- Java入门与进阶P-4.5+P-4.6
逻辑类型 关系运算的结果是要给逻辑值,true或false.这个值可以保存在一个对应的逻辑类型变量中,这样的变量类型是boolean 布尔是为了纪念George Boole对逻辑计算得到贡献 bool ...
- Linux服务器硬件及RAID配置
Linux服务器硬件及RAID配置 一.RAID磁盘阵列介绍 独立冗余磁盘阵列(Redundant Array of Independent Disks) 作用: 把多块独立的物理硬盘按不同的方式组合 ...
- vue学习笔记(四)---- 品牌管理案例
一.导入相关包 <script src="../lib/vue2.6.10.min.js"></script> <script src=". ...
- 银河麒麟服务器操作系统安装VMware Tool
安装前提:确保虚拟机连接iso 注:因为我已经安装过VMware Tools,因此此时是显示重新安装 点击重新安装后,会弹出如下对话框,选择"是" 选择"确定" ...
- Element ui &多选框、输入框、下拉框、开关、上传文件
ElementUI多选框 Checkbox 使用 <el-checkbox v-model="checked">备选项</el-checkbox> < ...
- Symbol详解
Symbol Symbol是es6引入的一个新的原始数据类型,是一个独一无二的值. 目前为止,js的数据类型有以下几种: 数据类型 说明 undefined undefined null null b ...
- ONES 对话 Eolink :数字化企业连接世界的第一接口
Eolink Eolink 的创业方向是一次无心插柳. 在 Eolink 创办之前,创始人刘昊臻先后参与了技术外包.在线医疗.O2O 电商等创业项目,但是觉得不太符合自己的期望. 2015 年底,刘昊 ...
- K3S系列文章-使用AutoK3s在腾讯云上安装高可用K3S集群
开篇 <K3s 系列文章> <Rancher 系列文章> 方案 在腾讯云上安装 K3S 后续会在这套 K3S 集群上安装 Rancher 方案目标 高可用 3 台master ...
- 精华推荐 |【算法数据结构专题】「延时队列算法」史上非常详细分析和介绍如何通过时间轮(TimingWheel)实现延时队列的原理指南
时间轮的介绍 时间轮(TimeWheel)是一种实现延迟功能(定时器)的精妙的高级算法,其算法应用范围非常广泛,在Java开发过程中常用的Dubbo.Netty.Akka.Quartz.ZooKeep ...
- vue element-ui table 实现自动滚动效果
<el-table :data="tableData" stripe class="swiper-page-table" ref="table& ...