76.最小覆盖子窜

2024-06-06 04:58
文章标签 覆盖 最小 76

本文主要是介绍76.最小覆盖子窜,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

76.最小覆盖子窜

解题思路:双指针滑动窗口

package leadcode;import java.util.HashMap;
import java.util.Map;/*** @author : icehill* @description : 最小覆盖子窜* 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果s中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。* 注意:如果s中存在这样的子串,我们保证它是唯一的答案。* 示例 1:* 输入:s = "ADOBECODEBANC", t = "ABC"* 输出:"BANC"* 示例 2:* 输入:s = "a", t = "a"* 输出:"a"* 提示:* 1 <= s.length, t.length <= 105* s 和 t 由英文字母组成* 进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?* <p>* 来源:力扣(LeetCode)* 链接:https://leetcode-cn.com/problems/minimum-window-substring* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。* 题目分析:* 需要找到s的子窜,并且子窜必须包含t中所有的字符,且字符出现的频率必须大于t* 例如s=abcb t=aab,s中无法覆盖t* 1.暴力解法(不考虑)* 枚举s所有长度大于t的子窜,判断子窜是否覆盖t* 时间复杂度:O(n^3) 空间复杂度O(n) (n为s的长度,求s的子窜,n^2,对于子窜,再判断频数跟t比较n,所以总的n^3)* 由于子窜的判断中做了很多重复的工作,或者没必要的工作,所以我们不考虑这种解法* 2.我们使用双指针的滑动窗口解题* 例如:s=aadobecodebanc t=abc* a.移动右指针找到第一个覆盖t* s=[aadobec]odebanc* b.移动左指针,直到不满足覆盖t* s=a[adobec]odebanc* c.右指针向右移动并探测,如果找到一个属于t的字符,重复b尝试移动右指针,记录当前窗口是否是最小值* s=a[adobecodeb]anc* s=aadobe[codeba]nc* s=aadobecode[banc]* d.返回最小子窜* @date : 2021-05-18*/
public class Solution76 {public static void main(String[] args) {Solution76 solution76 = new Solution76();
//        System.out.println(solution76.minWindow("ADOBECODEBANC", "ABC"));System.out.println(solution76.minWindow("bba", "ab"));}public String minWindow(String s, String t) {Map<Character, Integer> tMap = new HashMap<>();Map<Character, Integer> targetMap = new HashMap<>();//把t转换成哈希表,并统计数量for (int i = 0; i < t.length(); i++) {if (!tMap.containsKey(t.charAt(i))) {tMap.put(t.charAt(i), 1);targetMap.put(t.charAt(i), 0);} else {tMap.put(t.charAt(i), 1 + tMap.get(t.charAt(i)));}}int count = 0;int start = -1;int end = -1;//移动右指针,直到找到第一个符合的子窜for (int j = 0; j < s.length(); j++) {if (tMap.containsKey(s.charAt(j))) {if (start == -1) {start = j;}targetMap.put(s.charAt(j), 1 + targetMap.get(s.charAt(j)));if (targetMap.get(s.charAt(j)) <= tMap.get(s.charAt(j))) {count++;}}if (count >= t.length()) {end = j;break;}}if (count != t.length()) {return "";}//移动左指针,直到刚好满足覆盖子窜,就是当前右指针所在位置对应的最小子窜while (start < end + 1) {if (targetMap.get(s.charAt(start)) == null) {start++;continue;}if (targetMap.get(s.charAt(start)) > tMap.get(s.charAt(start))) {targetMap.put(s.charAt(start), targetMap.get(s.charAt(start)) - 1);start++;} else {break;}}int slow = start;//移动右指针,扩大滑动窗口for (int fast = end + 1; fast < s.length(); fast++) {if (tMap.containsKey(s.charAt(fast))) {targetMap.put(s.charAt(fast), 1 + targetMap.get(s.charAt(fast)));//移动左指针,缩小滑动窗口while (slow < fast) {if (targetMap.get(s.charAt(slow)) == null) {slow++;continue;}if (targetMap.get(s.charAt(slow)) > tMap.get(s.charAt(slow))) {targetMap.put(s.charAt(slow), targetMap.get(s.charAt(slow)) - 1);slow++;} else {break;}}if (fast - slow < end - start) {start = slow;end = fast;}}}return s.substring(start, end + 1);}
}

这篇关于76.最小覆盖子窜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035146

相关文章

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回