leetcodeQ76最小覆盖子串

目录

思路

滑动窗口,记录区间【left,right】之间的子串覆盖没覆盖t,就是t里面的元素是不是在区间之内都找到。

有几个比较难的问题

  1. 怎么确定满足条件了,就是【left,right】之间的子串已经覆盖t,

我们可以将t用map存,这个map不会太大,因为就是大小写字母,key是字符,v是出现的次数。

然后遍历s,如果s的第i个字符在之前的map里面,则减1,当减到为0,则这个字符满足条件,然后如果t里面所有的字符都满足条件,则可以计算结果,长度为right-left+1;

之后就是左边界往右走,往右走是map里面的值加一,如果加大某一个字符的map值大于0了,则不满足条件了,right再加。

代码

java 复制代码
class Solution {
    public String minWindow(String s, String t) {
        
        Map<Character, Integer> map = new HashMap<>(80);
        int totalT =0;
        for (int i = 0; i < t.length(); i++) {
            if (map.containsKey(t.charAt(i))){
                int cnt = map.get(t.charAt(i));
                map.put(t.charAt(i), cnt+1);
            }else {
                totalT++;
                map.put(t.charAt(i),1);
            }
        }
        int left = 0;
        int right = 0;
        int result =Integer.MAX_VALUE;
        String resultString = "";
        for (right = 0; right < s.length(); right++){
            if (map.containsKey(s.charAt(right))){
                int k = map.get(s.charAt(right));
                map.put(s.charAt(right),k-1);//可以继续减,减成负值
                if (k-1 == 0){//正好满足条件
                    totalT--;
                    if (totalT == 0){
                       while (left<=right){
                           if (map.containsKey(s.charAt(left))){
                               int p = map.get(s.charAt(left));
                               if(p == 0){//减去这个就不行了
                                   if (result > (right -left +1)){ //先记录答案
                                       result = right-left+1;
                                       resultString = s.substring(left,right+1);
                                   }
                                   totalT++;//重新计算答案
                                   map.put(s.charAt(left),p+1);
                                   left++;
                                   break;
                               }
                               map.put(s.charAt(left),p+1);
                           }
                           left++;
                       }
                    }
                }
            }
        }
        //
        return resultString;
        }
}
相关推荐
誓约酱3 分钟前
排序算法 -计数排序
数据结构·c++·算法·排序算法
拉里小猪的迷弟9 分钟前
设计模式-行为型-常用-2:职责链模式、状态模式、迭代器模式
java·设计模式·迭代器模式·状态模式·责任链模式
向阳121810 分钟前
Dubbo 使用轻量的 Java SDK 开发 RPC Server 和 Client
java·rpc·dubbo
Fms_Sa23 分钟前
分别写出在散列表中插入和删除关键字为K的一个记录的算法,设散列函数为H,解决冲突的方法为链地址法。
c语言·数据结构·算法·哈希算法·散列表
CT随25 分钟前
Redis
java·redis·mybatis
guokanglun25 分钟前
Mock.js生成随机数据,拦截 Ajax 请求
开发语言·javascript·ajax
椰椰椰耶26 分钟前
【软件测试】一个简单的自动化Java程序编写
java·自动化·压力测试
Trouvaille ~26 分钟前
【优选算法篇】化繁为简,见素抱朴:从乱象中重构秩序的艺术
c++·算法·面试·蓝桥杯·排序算法·快速排序·分治
我命由我1234528 分钟前
7.Java 注解和元注解(三种注解、四种元注解)
java·开发语言·笔记·后端·java-ee·intellij-idea·intellij idea
The_tuber_sadness33 分钟前
Kotlin深度面试题:协程、密封类和高阶函数
android·开发语言·kotlin