[Java][Leetcode hard] 76. 最小覆盖子串

官解: 滑动窗口 + 字符索引数组

  • 采用一个数组统计t中出现字符的频率,并用一个变量统计字符的种类
  • 移动右边界,记录在t中有出现的字符频率和种类,如果最终相等,说明符合结果,记录并比较获得最小值
  • 移动左边界,直到字符种类刚好小于原统计的字符种类,例如: s = "ADOBECODEBANC", t = "ABC" 到BEC那里开始从A移动左边界,移到D位置。
java 复制代码
class Solution {
    public String minWindow(String s, String t) {
         if(s == null || s.length() == 0 || t == null || t.length() == 0)
         return "";
         int m = s.length(), n = t.length();

         int[] need = new int[128];
         int[] window = new int[128];

         // 记录字符出现频率
         for(char c : t.toCharArray()){
            need[c]++;
         }
         // 记录字符种类
         int charKind = 0;
         for(int i=0;i<128;i++){
            if(need[i] > 0) charKind++;
         }

         int left = 0,right = 0;
         int matchKind = 0;
         int minLen = Integer.MAX_VALUE;
         int minStartIndex = 0;
         while(right < s.length()){
            char c = s.charAt(right);
            right++;

            if(need[c] > 0){
                window[c]++;
                if(window[c] == need[c]){
                    matchKind++;
                }
            }

            //  满足题目条件
            while(matchKind == charKind){
                // 记录最小覆盖子串
                if(right - left < minLen){
                    minLen = right - left;
                    minStartIndex = left;
                }

                // 缩减左边界
                char leftChar = s.charAt(left);
                left++;
                if(need[leftChar] > 0){
                    window[leftChar]--;
                    if(need[leftChar] > window[leftChar]){
                        matchKind--;
                    }
                }
            }
         }
         
         return minLen == Integer.MAX_VALUE ? "":s.substring(minStartIndex, minStartIndex + minLen);
    }
   
}```
相关推荐
@航空母舰2 小时前
SpringBoot通过Map实现天然的策略模式
java·spring boot·后端
Co_Hui3 小时前
Java 并发编程
java
拳里剑气3 小时前
C++算法:多源BFS
c++·算法·宽度优先·多源bfs
ysa0510304 小时前
【板子】短序列dp(换成维护更小常数维度的dp)
c++·笔记·算法·板子
shwill1234 小时前
PID 算法(三)--- 增量 PID ↔ 单神经元 PID 等价映射
linux·算法
long3164 小时前
Java 新手入门与实战开发指南
java·开发语言
执笔画流年呀4 小时前
Linux搭建Java项目部署环境
java·linux·运维
程序员天天困4 小时前
Arthas ognl 表达式从入门到实战:掌握在线调试最强的表达式引擎
java·jvm·后端
IT_Octopus5 小时前
Spring Boot 中 ThreadLocal 请求上下文的完整生命周期
java·spring boot·spring
wabs6665 小时前
关于图论【卡码网110.字符串迁移的思考】
数据结构·算法·图论