LeetCode:最小覆盖字串

java 复制代码
class Solution {
    public String minWindow(String s, String t) {
        if(s == null || s.length() == 0 || t == null || t.length() == 0){
            return "";
        }
        //存放t字符串中的字符个数
        int[] need = new int[128];
        //将t字符串存放进need数组中
        for(int i = 0; i < t.length(); i++){
            need[t.charAt(i)]++;
        }
        //左右指针
        int left = 0, right = 0;
        //记录t字符串的总长度
        int needCount = t.length();
        //记录最短字串的起始位置
        int minStart = 0;
        //记录最短字串的长度,先初始化
        int minLen = Integer.MAX_VALUE;

        while(right < s.length()){
            char c = s.charAt(right);
            //这个字符是所需要的就将字符串总长度-1
            if(need[c] > 0){
                needCount--;
            }
            need[c]--;
            
            if(needCount == 0){
                //清空后使用left指针进行多余字符的处理
                while(left < right && need[s.charAt(left)] < 0){
                    //将处理后的字符+1
                    need[s.charAt(left)]++;
                    left++;
                }
                //记录当前的最短窗口
                if(right - left + 1 < minLen){
                    minLen = right - left + 1;
                    minStart = left;
                }
                //将left当前所处的最前面的字符去掉,往后寻找是否存在更短字串
                need[s.charAt(left)]++;
                needCount++;
                left++;
            }
            right++;
        }
        //返回空串或者截取最短字串
        return minLen == Integer.MAX_VALUE ? "" : s.substring(minStart,minStart + minLen); 
    }
}

1.将字串t存放到数组中

2.使用right指针处理need数组和needCount计数器

3.得到第一个最小字串

4.处理字串中前方多余的字符

5.单个字母依次踢出最小字串中,往后寻找更优的字串

while (left < right && need[s.charAt(left)] < 0):存在need[s.charAt(left)] < 0这个条件left本身不会超过right,但是为了安全,加了left < right这层保障

相关推荐
澈20718 小时前
C++并查集:高效解决连通性问题
java·c++·算法
旖-旎20 小时前
深搜练习(单词搜索)(12)
c++·算法·深度优先·力扣
2401_8734794020 小时前
运营活动被薅羊毛怎么防?用IP查询+设备指纹联动封堵漏洞
java·网络·tcp/ip·github
ShiJiuD66688899920 小时前
大事件板块一
java
摇滚侠20 小时前
@Autowired 和 @Resource 的区别
java·开发语言
SeaTunnel20 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
企客宝CRM20 小时前
2026年中小企业CRM选型指南:企客宝CRM处于什么位置?
android·算法·企业微信·rxjava·crm
橙淮21 小时前
二叉树核心概念与Java实现详解
数据结构·算法
吴声子夜歌21 小时前
Java——线程的基本协作机制
java·线程协作
米罗篮21 小时前
DSU并查集 & 拓展欧几里得-逆元
c++·经验分享·笔记·算法·青少年编程