给你一个字符串 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 的子串中,

因此没有符合条件的子字符串,返回空字符串。

提示:

1 <= s.length, t.length <= 105

s 和 t 由英文字母组成

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

来源:力扣(LeetCode)

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

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

利用ASCII码来映射(双指针)

public class LC76 {
public static void main(String[] args) {
String s = "ADOBECODEBANC";
String t = "ABC";
System.out.println(minWindow(s, t));
System.out.println(Solution.minWindow(s, t));
} /**
* @param s
* @param t
* @return
*/
public static String minWindow(String s, String t) {
char[] chars = s.toCharArray();
char[] chart = t.toCharArray();
int sLength = chars.length, tLength = chart.length;
String res = "";
int countMin = 0;
int[] hash = new int[128]; for (int i = 0; i < tLength; i++) {
hash[chart[i]]--;
} for (int fastIndex = 0, slowIndex = 0; fastIndex < sLength; fastIndex++) {
hash[chars[fastIndex]]++;
if (hash[chars[fastIndex]] <= 0) countMin++;
while (countMin == tLength && hash[chars[slowIndex]] > 0) {
hash[chars[slowIndex++]]--;
}
if (countMin == tLength) {
if (res.equals("") || res.length() > fastIndex - slowIndex + 1) {
res = s.substring(slowIndex, fastIndex + 1);
}
}
}
return res;
}
} class Solution {
/**
* @param s
* @param t
* @return
*/
public static String minWindow(String s, String t) {
//字符串转回字符数组
char[] chars = s.toCharArray();
char[] chart = t.toCharArray();
int sLength = chars.length, tLength = chart.length;
//如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""
String res = "";
//最小子串,计数变量
int countMin = 0;
//利用ASCII码来映射,t中含有的字符--
int[] hash = new int[128]; //t中含有的字符,hash数组中赋值-n,t中可能重复字符
for (int i = 0; i < tLength; i++) {
hash[chart[i]]--;
} //开始判断
for (int fastIndex = 0, slowIndex = 0; fastIndex < sLength; fastIndex++) {
//s中有,相应的位置++
hash[chars[fastIndex]]++;
//这个位置映射的数字要是还是小于0,表明有相同的字符
if (hash[chars[fastIndex]] <= 0) countMin++;
//如果这个子字符串已经有了所有的t中的字符,映射位置flag数值还原
while (countMin == tLength && hash[chars[slowIndex]] > 0) {
hash[chars[slowIndex++]]--;
}
//如果计数等于t的长度,返回结果
if (countMin == tLength) {
//判断是否是不存在
if (res.equals("") || res.length() > fastIndex - slowIndex + 1) {
res = s.substring(slowIndex, fastIndex + 1);
}
}
}
return res;
}
}

LC-76的更多相关文章

  1. [LC] 76. Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  2. 159. Longest Substring with At Most Two Distinct Characters

    最后更新 二刷 08-Jan-17 回头看了下一刷的,用的map,应该是int[256]的意思,后面没仔细看cuz whatever I was doing at that time.. wasnt ...

  3. CSPS模拟75&76

    感觉自己还是太菜了... 最近考试一直想不出来正解.难受(然而蒟蒻的博客没人看也要不来小猪peiqi的图) 模拟75:血炸... 考场上推了快两个小时的T1式子,然后心态炸裂,然后我也不知道自己干了什 ...

  4. LC T668笔记 & 有关二分查找、第K小数、BFPRT算法

    LC T668笔记 [涉及知识:二分查找.第K小数.BFPRT算法] [以下内容仅为本人在做题学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] !! ...

  5. 四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。

    laviewpbt  2014.8.4 编辑 Email:laviewpbt@sina.com   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以 ...

  6. “LC.exe”错误

    错误“LC.exe”已退出,代码为 -1. 可能的原因是: 这个第三方组件是个商业组件,他在组件的主使用类定义了 LicenseProvider(typeof(LicFileLicenseProvid ...

  7. 解决VS下“LC.exe已退出,代码为-1”问题

    今天使用VS2015开发一个Winform程序,手一抖拖错了一个第三方控件,然后将其去掉并删除相关的引用,结果导致了LC.exe错误:"Lc.exe已退出,代码为-1 ". 经过上 ...

  8. 解析.NET 许可证编译器 (Lc.exe) 的原理与源代码剖析

    许可证编译器 (Lc.exe) 的作用是读取包含授权信息的文本文件,并产生一个可作为资源嵌入到公用语言运行库可执行文件中的 .licenses 文件. 在使用第三方类库时,经常会看到它自带的演示程序中 ...

  9. 76 binary_search 查找重复元素

    [本文链接] http://www.cnblogs.com/hellogiser/p/binary-search-for-repeated-element.html [题目] 给定一个升序排列的自然数 ...

  10. Lc.exe已退出,代码为-1

    编译项目,出现提示"Lc.exe已退出,代码为-1" .   解决办法: 意思就是把licenses.licx这个文件里的内容删除,但是文件还在(此时是个空文件),发生这个问题的原 ...

随机推荐

  1. LGP5544题解

    题目大意 题意这么明显就不说了qwq 首先最值,而且也想不到啥解法,果断 \(\rm SA\). 然后是初始位置.初始位置就是 \(((\sum_{i=1}^m x)/m,(\sum_{i=1}^m ...

  2. Python 基于 selenium 实现不同商城的商品价格差异分析系统

    1. 前言 selenium 原本是一款自动化测试工具,因其出色的页面数据解析和用户行为模拟能力而常用于爬虫程序中,致使爬虫程序的爬取过程更简单.快捷. 爬虫程序与其它类型程序相比较,本质一样,为数据 ...

  3. 理解HMM算法

    长这样: 理解的前提: (1)状态:生成观测值的变量(上图中的"吃"和"睡"). (2)观测值:状态乘上输出概率对应的输出(上图中的橙色节点). (3)输出概率 ...

  4. mysql 锁表

    mysql 查看锁表解锁-- 查看那些表锁到了show OPEN TABLES where In_use > 0;-- 查看进程号show processlist;--删除进程 kill 108 ...

  5. 官宣 .NET 7 Preview 2

    今天,我们很高兴发布 .NET 7 预览版 2..NET 7 的第二个预览版包括对 RegEx 源生成器的增强.将 NativeAOT 从实验状态转移到运行时的进展,以及对"dotnet n ...

  6. web服务器-nginx配置文件

    web服务器-nginx配置文件 一 nginx配置文件 #启动子进程程序的默认用户 #user nobody #一个主进程和多个工作进程.工作进程是单进程的,且不需要特殊授权即可运行:这里定义的是工 ...

  7. Spring Security实现统一登录与权限控制

    1  项目介绍 最开始是一个单体应用,所有功能模块都写在一个项目里,后来觉得项目越来越大,于是决定把一些功能拆分出去,形成一个一个独立的微服务,于是就有个问题了,登录.退出.权限控制这些东西怎么办呢? ...

  8. IC设计基础

    一 前言 这一周连续两场线下面试,紧接着又是微信视频面试,从连续三天的面试中,收获颇丰! 存在的问题: 一是对项目细节模糊: 二是IC基础知识薄弱: 具体表现是,在面试过程中,如被问到DDR3和千兆以 ...

  9. Prometheus+alertmanager告警配置-2

    prometheus 告警 prometheus 通过alertmanager进行告警 实现监控告警的步骤: 在prometheus中定义告警规则rule_files alertmanager配置告警 ...

  10. Python - 函数的五大参数

    Python的函数参数挺重要的,总结一下: (1)位置参数:没啥好说的,就是普通的参数. (2)默认参数: 参数形式:def power(x, n = 3): (在函数定义时通过对一个形参赋值的形式, ...