算法刷题:最小覆盖子串

这篇具有很好参考价值的文章主要介绍了算法刷题:最小覆盖子串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

.

算法刷题:最小覆盖子串,算法刷题,算法,哈希算法

题目链接

最小覆盖子串

题目详情

算法刷题:最小覆盖子串,算法刷题,算法,哈希算法

题目解析

这道题的要求是在s字符串中找到包含t字符串中所有字母的子串,并要求找到长度最小的,很显然,这道题适合用滑动窗口来解决

算法原理

滑动窗口流程图

算法刷题:最小覆盖子串,算法刷题,算法,哈希算法

定义变量

双指针的初始值都为0
定义hash表记录t和窗口中的字母个数
定义变量统计t和窗口内的有效字母种类
有效字母种类:
窗口内hash某个字母的个数大于等于t的hash中的该字母的个数时,为有效
定义变量,记录最小子串的初始值和长度

进窗口

将right所在字母存到hash中,并维护窗口内有效字母种类:
当窗口内hash某个字母的个数等于t的hash中的该字母的个数时,变量加一

判断

t和窗口内的有效字母种类相同时,进行更新结果,然后出窗口,找到下一个满足条件的子串

出窗口

出窗口之前,需要维护窗口内有效字母种类,如果当前要出窗口的字母的个数正好等于t的hash中的该字母的个数,出窗口之后,窗口内有效种类会减少,因此需要提前维护

更新结果

比较当前窗口的长度与之前的最小长度,更新最小子串的初始值和长度文章来源地址https://www.toymoban.com/news/detail-837973.html

我的答案

class Solution {
    public String minWindow(String s, String t) {
        //定义变量,记录子串初始值
        int begin = -1;
        //定义变量记录最小长度
        int len =Integer.MAX_VALUE;
        // 将两个字符串转成数组,方便遍历
        char[]ss = s.toCharArray();
        char[]tt = t.toCharArray();
        //创建hash1,记录t
        int[]hash1 = new int[128];
        //定义变量记录tt中字母的种类
        int core = 0;
        for(int tmp:tt){
            if(hash1[tmp]==0) core++;
            hash1[tmp]++;
        }
        //创建hash2,记录窗口
        int[]hash2 = new int[128];
        //定义变量记录窗口内有效种类
        int count = 0;
        //定义指针
        for(int left = 0,right = 0;right<ss.length;right++){
            //进窗口
            char in = ss[right];
            hash2[in]++;
            //维护有效种类
            if(hash2[in]==hash1[in]) count++;
            //判断
            while(count==core){
                //满足条件,更新结果(子串的最小长度)
                if(len>right-left+1){
                    begin=left;
                    len =right-left+1; 
                }
                char out = ss[left];
                //维护有效种类
                if(hash2[out]==hash1[out]) count--;
                //出窗口
                hash2[out]--;
                left++;
            }
        }
        if(begin==-1) return new String();
        return s.substring(begin,begin+len);
    }
}

到了这里,关于算法刷题:最小覆盖子串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法刷题-哈希表-三数之和

    用哈希表解决了两数之和,那么三数之和呢? 力扣题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意: 答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2

    2024年02月09日
    浏览(32)
  • 【算法刷题之哈希表(2)】

    (1)题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 = i, j, k, l n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0 (2)思路与方法 对于这道题可能首先想到的就是对于四个数组进行循环遍历,但是这种方法的时间复杂

    2024年02月11日
    浏览(32)
  • 算法刷题-哈希表-四数相加

    需要哈希的地方都能找到map的身影 力扣题目链接 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果

    2024年02月08日
    浏览(34)
  • 算法刷题-哈希表-有效的字母异位词

    数组就是简单的哈希表,但是数组的大小可不是无限开辟的 力扣题目链接 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true 示例 2: 输入: s = “rat”, t = “car” 输出: false 说明: 你可以假设字符串只包

    2024年02月09日
    浏览(33)
  • 76. 最小覆盖子串

    76. 最小覆盖子串 滑动窗口 两个 Integer 相等比较应该用 equals,而不是 ==。 一个 Integer 和一个 int 比较,Integer 会自动拆箱,可以用 ==。

    2024年02月06日
    浏览(30)
  • LeetCode----76. 最小覆盖子串

     题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 示例 1: 输入:s = “ADOBECODEBANC”, t = “ABC” 输出:“BANC” 解释:最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、

    2024年02月06日
    浏览(38)
  • 最小覆盖子串(Java详解)

    目录 一、题目描述 二、题解 给定两个字符串  s  和  t  。返回  s  中包含  t  的所有字符的最短子字符串。如果  s  中不存在符合条件的子字符串,则返回空字符串  \\\"\\\"  。 如果  s  中存在多个符合条件的子字符串,返回任意一个。 注意:  对于  t  中重复字符,我

    2024年02月03日
    浏览(22)
  • 考研算法复试刷题19天:Prim算法求最小生成树 【prim,最小生成树】

    参考博客:图解:什么是最小生成树? - 知乎 (zhihu.com)  总结下来的过程就是,一张图,我们将他化为树的形式,也就是生成树。那么最小生成树有是啥呢? 所谓一个 带权图 的最小生成树,就是原图中边的权值最小的生成树 ,所谓最小是指边的权值之和小于或者等于其它

    2024年02月07日
    浏览(48)
  • 「优选算法刷题」:长度最小的子数组

    给定一个含有  n   个正整数的数组和一个正整数  target  。 找出该数组中满足其总和大于等于   target   的长度最小的  连续子数组   [numsl, numsl+1, ..., numsr-1, numsr]  ,并返回其长度 。 如果不存在符合条件的子数组,返回  0  。 示例 1: 示例 2: 示例 3: 这道题也是一道

    2024年01月23日
    浏览(29)
  • leetcode做题笔记76最小覆盖子串

    给你一个字符串  s  、一个字符串  t  。返回  s  中涵盖  t  所有字符的最小子串。如果  s  中不存在涵盖  t  所有字符的子串,则返回空字符串  \\\"\\\"  。 注意: 对于  t  中重复字符,我们寻找的子字符串中该字符数量必须不少于  t  中该字符数量。 如果  s  中存在

    2024年02月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包