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 && needs.charAt(left) < 0):存在needs.charAt(left) < 0这个条件left本身不会超过right,但是为了安全,加了left < right这层保障

相关推荐
zcmodeltech几秒前
冷链物流沙盘模型控制系统设计——基于STM32与Modbus RTU的冷藏车、冷库全流程动态展示方案
数据结构·stm32·单片机·嵌入式硬件·物联网·能源
mmmmath_32 分钟前
LeetCode.350.两个数组的交集II
算法
Ivanqhz9 分钟前
图是“拓扑 + 类型 + 形状“的世界
算法·决策树·机器学习·php·集成学习
云雀衔光16 分钟前
Java Spring AI MCP:在 Spring 里把 AI 接上你的业务系统
java·开发语言·人工智能·后端·测试工具·spring
重生之小比特19 分钟前
【Java SE】数据类型与变量
java·开发语言·python
苏渡苇19 分钟前
Spring Insight 里如何对 Span 进行清洗
java·spring boot·后端·spring·系统监控
find1star20 分钟前
LeetCode 54:螺旋矩阵——用四个边界模拟矩阵收缩
java·算法·leetcode·边缘计算·学习方法
Yeniden22 分钟前
Java 后端从零到企业级:第1篇 Java 基础语法——变量、数据类型与运算符
java·开发语言·apache
邪修king23 分钟前
Linux系统篇(二十三) 基础 IO:从“文件”到“文件描述符”,彻底理解重定向
android·java·linux
云雀衔光32 分钟前
MCP + 应用生成:让 AI 直接产出可交互的应用
java·人工智能·测试工具·microsoft·交互·ai编程