首页 > 其他分享 >76.最小覆盖子串——学习笔记

76.最小覆盖子串——学习笔记

时间:2023-03-20 21:35:07浏览次数:43  
标签:子串 字符 right 笔记 76 window need left

题目:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""

注意

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案
    示例1
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。

示例2

输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。

示例3

输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

题目来源:力扣(LeetCode) 链接

解题模板(出自labuladong)

/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
    Map<Character, Integer> need = new HashMap<>();
    Map<Character, Integer> window = new HashMap<>();
    for (char c : t.toCharArray()) 
        need.put(c,need.getOrDefault(c,0)+1);
	int left = 0, right = 0;
	int valid = 0; 
	while (right < s.size()) {
    	// c 是将移入窗口的字符
   	 	char c = s.charAt(right);
    	// 右移窗口
    	right++;
    	// 进行窗口内数据的一系列更新
    	...

    	/*** debug 输出的位置 ***/
    	System.out.println("window: ["+left+","+ right+")");
    	/********************/
    
    	// 判断左侧窗口是否要收缩
    	while (window needs shrink) {
        	// d 是将移出窗口的字符
        	char d = s[left];
        	// 左移窗口
        	left++;
        	// 进行窗口内数据的一系列更新
        	...
    	}
	}
}

题解

class Solution {
    public String minWindow(String s, String t) {
        //定义一个map以键值对的方式存放t中的每一个字符以及对应的个数
        Map<Character, Integer> need = new HashMap<>();
        //定义一个map存放窗口中对应的字符和字符个数
        Map<Character, Integer> window = new HashMap<>();
        //把字符串t中的字符和对应的个数保存到map中
        for(char c : t.toCharArray()) {
            //getOrDefault(key,default)函数作用:
            //如果存在key,就返回对应的value,否则返回默认值
            need.put(c, getOrDefault(c, 0) + 1);
        }
        int left = 0;//定义左指针
        int right = 0;//定义右指针
        //count用来记录窗口中的字符个数是否满足需要,如果有一个字符满足,count++
        int count = 0;
        int start = 0;//用来记录满足要求的子串的起始位置
        //len用来记录满足要求的子串的长度,每次都与len比较,选出来最小的
        int len = Interget.MAX_VALUE;
        while (right < s.length()) { //更新窗口
            char c = s.toCharAt(right);
            right++;
            if (need.containsKey(c)) { //判断取出的字符是否是need需要的
                //如果需要,就把该字符和个数放入到window中
                window.put(c, getOrDefault(c, 0) + 1);
                //如果window中的c字符个数满足要求,就记录下来
                if (need.get(c) == window.get(c)) {
                    count++;
                }
            }
            //count == need.size()说明此时子串满足要求,所以开始收缩窗口
            while (count == need.size()) {
                //如果此时子串长度更小就更新len,并且更新子串的起始位置
                if (right - left < len) {
                    len = right - left;
                    start = left;
                }
                //从子串最左侧开始取出字符(收缩窗口)
                char d = s.toCharAt(left);
                left++;
                //判断need中是否存在该字符
                if (need.containsKey(d)) {
                    //先判断此时need中该字符的数量是否和window中的相等,相等就count--
                    if (need.get(d) == window.get(d)) {
                        count--;
                    }
                    //每次都要先判断再把window中对应的字符数量减1
                    window.put(d, window.get(d) - 1);
                }
            }
        }
        //如果len不等于原来的值说明找到了,就返回对应子串,否则返回空串
        return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);
    }
}

标签:子串,字符,right,笔记,76,window,need,left
From: https://www.cnblogs.com/benben-home/p/17209254.html

相关文章

  • 算法笔记的笔记——第5章 数学问题
    简单数学略最大公约数与最小公倍数最大公约数intgcd(inta,intb){if(b==0){returna;}else{returngcd(b,a%b);}}......
  • 外设驱动库开发笔记52:PM3003S激光粉尘仪驱动
      空气质量是现代日常生活中人们所关注的事情,也是生存环境好坏的一种体现。其中粉尘数量监测更是空气质量检测中最常见的对象,在我们的检测设备中也经常会有这种需求。检......
  • P2763 试题库问题
    假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。任务:求满足要......
  • 704.二分查找——学习笔记
    题目:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1输入:nums=[-1,0,3......
  • 35.搜索插入位置——学习笔记
    题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。......
  • 34.在排序数组中查找元素的第一个和最后一个位置——学习笔记
    题目:给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。......
  • Android studio学习笔记
    wrap_content内容有多少,它的宽度有多少match_parent匹配父空间,上一级宽度多少,这一级多少使用宽度长度自定义的时候最好用dp,因为Android屏幕碎片化比较严重,在不同的系统......
  • 《操作系统导论》读书笔记1——CPU虚拟化,进程
    系列文章目录和关于我一丶CPU的虚拟化一个桃子,我们称之为物理(physical)桃子。但有很多想吃这个桃子的人,我们希望向每个想吃的人提供一个属于他的桃子,这样才能皆大欢喜。......
  • 【学习笔记】差分约束学习笔记
    简述差分约束系统,是由\(n\)个元素和\(m\)个约束条件构成的,其中每个约束条件形如\(x_i-x_j\ley_k\)。求解移项得到\(x_i\lex_j+y_k\),这样三角形不等式的形式类似......
  • 构建之法阅读笔记01
    第一章概论在这一章中,作者为我们介绍了一些关于软件工程的基本知识。①软件=程序+软件工程:正是因为对软件开发活动(构建管理、源代码管理、软件设计、软件测试、项目管理......