【Hot100】LeetCode—76. 最小覆盖子串

题目


1- 思路

利用两个哈希表解决分为 :① 初始化哈希表②遍历 s,处理当前元素,判断当前字符是否有效③收缩窗口④更新最小覆盖子串


2- 实现

⭐76. 最小覆盖子串------题解思路

java 复制代码
class Solution {
    public String minWindow(String s, String t) {

        // 定义两个 HashMap
        HashMap<Character,Integer> hs = new HashMap<>();
        HashMap<Character,Integer> ht = new HashMap<>();
        // 定义 
        int cnt = 0;
        String res = "";

        // 初始化 ht
        for(int i = 0 ; i < t.length();i++){
            char c = t.charAt(i);
            ht.put(c,ht.containsKey(c) ? ht.get(c)+1:1);

        }

        // 遍历 s
        for(int i = 0, j = 0 ; i < s.length();i++){
            char c = s.charAt(i);
            hs.put(c, hs.containsKey(c) ? hs.get(c)+1 : 1);

            // 判断 i 合法
            if(ht.containsKey(c) && hs.get(c) <= ht.get(c)) cnt++;

            // 缩小区间
            while (j <= i && (!ht.containsKey(s.charAt(j)) || hs.get(s.charAt(j)) > ht.get(s.charAt(j)))) 
            {
                hs.put(s.charAt(j), hs.get(s.charAt(j ++)) - 1);
            }

            // 3 收集结果
            // 首先是必须等于 cnt && (hs.length()> (i-j+1) || res.length()<1)
            if(cnt==t.length() && ( res.length() > (i-j+1) || res.length()<1)){
                res = s.substring(j,i+1);
            }

        }
        return res;
    }
}

3- ACM 实现

java 复制代码
public class minWindow {

    public static String minWindow(String s,String t){
        // 1.数据结构
        HashMap<Character,Integer> ht = new HashMap<>();
        HashMap<Character,Integer> window = new HashMap<>();
        int cnt = 0;
        String res = "";

        // 2.遍历 t 初始化 ht
        for(int i = 0 ; i < t.length();i++){
            char c = t.charAt(i);
            ht.put(c,ht.containsKey(c)? ht.get(c)+1:1);
        }

        // 3.遍历 s
        for(int i = 0,j=0 ; i < s.length();i++){
            char cc = s.charAt(i);
            window.put(cc,window.containsKey(cc)? window.get(cc)+1:1);

            // 判 cc 断有效性
            // 在 ht 中
            if(ht.containsKey(cc) && window.get(cc) <=
                    ht.get(cc)) cnt++;

            // 窗口收缩
            while(j<=i && (!ht.containsKey(s.charAt(j)) || window.get(s.charAt(j)) > ht.get(s.charAt(j)))){
                window.put(s.charAt(j),window.get(s.charAt(j++))-1);
            }

            // 更行 res
            if(cnt == t.length() && (res.length()>(i-j+1) || res.length()<1)){
                res = s.substring(j,i+1);
            }
        }
        return res;
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入字符串1");
        String s = sc.nextLine();

        System.out.println("输入字符串2");
        String t = sc.nextLine();
        String res = minWindow(s,t);
        System.out.println("结果是"+ res);
    }
}

相关推荐
吃着火锅x唱着歌10 小时前
LeetCode 1446.连续字符
算法·leetcode·职场和发展
愚润求学10 小时前
【贪心算法】day10
c++·算法·leetcode·贪心算法
緈諨の約錠10 小时前
JVM基础篇以及JVM内存泄漏诊断与分析
java·jvm
Slaughter信仰10 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)
java·开发语言·jvm
Java进阶笔记10 小时前
JVM默认栈大小
java·jvm·后端
吴秋霖10 小时前
主流反爬虫、反作弊防护与风控对抗手段
爬虫·算法·反爬虫技术
java1234_小锋10 小时前
Scikit-learn Python机器学习 - 分类算法 - K-近邻(KNN)算法
python·算法·机器学习
智者知已应修善业10 小时前
【矩阵找最大小所在位置】2022-11-13
c语言·c++·经验分享·笔记·算法·矩阵
shan&cen10 小时前
Day04 前缀和&差分 1109. 航班预订统计 、304. 二维区域和检索 - 矩阵不可变
java·数据结构·算法
手握风云-11 小时前
回溯剪枝的 “减法艺术”:化解超时危机的 “救命稻草”(二)
算法·机器学习·剪枝