当前位置: 首页 > article >正文

LCR 017

题目:LCR 017


解法:滑动窗口

  1. Map存储t中各字母出现次数。

  2. 建立双指针,左指针指向子串起始,右指针指向子串结尾。

  3. 右指针扩张:若遍历元素在t中存在,Map对应value减1,当子串包含所有t中字符时,扩张结束,开始收缩。

  4. 左指针收缩:若遍历元素在t中存在,Map对应value加1。当遇到第一个有效字符时,收缩结束。

    public String minWindow1(String s, String t) {
        int left = 0, len = 0;
        String res = "";
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < t.length(); i++) {
            map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0) + 1);
        }
        for (int right = 0; right < s.length(); right++) {
            if (map.containsKey(s.charAt(right))) {
                if (map.get(s.charAt(right)) > 0) len++;//有效字符
                map.put(s.charAt(right), map.get(s.charAt(right)) - 1);
            }
            if (len == t.length()) {
                while (!(map.containsKey(s.charAt(left)) && map.get(s.charAt(left)) == 0)) {
                    if (map.containsKey(s.charAt(left))) map.put(s.charAt(left), map.get(s.charAt(left)) + 1);
                    left++;
                }
                res = res.isEmpty() || res.length() > right - left + 1 ? s.substring(left, right + 1) : res;
                map.put(s.charAt(left), map.get(s.charAt(left)) + 1);
                left++;
                len--;
            }
        }
        return res;
    }
  1. 问题:什么是有效字符?

    例如,当t=“abc”,s="abbbbc"时,s中实际有效字符只有’a’、‘b’、‘c’,中间多余的’b’均为无效字符,只有第一个’b’为有效字符。

  2. 问题:如何判断子串已经包含了t中所有字符?

    • 方法一:数组各个元素都小于等于0。缺点:要遍历整个数组
    • 方法二:维护一个变量len,表示有效字符个数,右指针每遍历一个有效字符,len加1,当len为t.length时,子串已包含t中所有元素
  3. 问题:右指针遍历时,如何判断该字符为有效字符?

    当数组对应位置元素大于0时(t中的该字符数>子串中该字符数),该字符为有效字符。

  4. 问题:左指针遍历时,如何判断该字符为有效字符?

    当数组对应位置元素等于0时(t中的该字符数=子串中该字符数),该字符为有效字符。

  5. 注意

    • 维护len变量时,只有遍历到有效字符时,len才减1
    • 当左指针收缩遇到第一个有效字符时,保留此时子串长度,然后左指针继续右移,剔除该有效字符,向后寻找是否还有满足条件的子串


http://www.kler.cn/a/292248.html

相关文章:

  • [Python学习日记-67] 封装
  • 【数据结构】线性表——栈与队列
  • 机器学习day5-随机森林和线性代数1
  • 【Qt】报错error: undefined reference to `vtable for的最简单解决
  • 智慧建造-运用Trimble技术将梦幻水族馆变为现实【上海沪敖3D】
  • Linux 实现自动登陆远程机器
  • 揭开分布式系统的神秘面纱:Java中的分布式链路追踪详解
  • Linux CentOS 部署Docker
  • 地理信息科学在考古学中的应用:GIS与遥感技术的时空穿梭之旅
  • 【数据分析预备】Numpy入门
  • 【刷题笔记】删除并获取最大点数粉刷房子
  • 二进制方式部署k8s集群
  • OpenCV结构分析与形状描述符(6)带统计的连通组件计算函数connectedComponentsWithStats()的使用
  • 数据结构-栈、队列-相关练习
  • DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?
  • OpenCVSharp中的GrabCut图像分割技术详解
  • C++封装、继承和多态
  • wmv怎么转换成视频mp4?简单的几种视频格式转换方法
  • 1024页 | 20万字详细讲解大数据系统平台设计
  • IP学习-Sixday
  • HTML5好看的花店商城源码3
  • Spark2.x 入门:逻辑回归分类器
  • JavaScript常见反调试手段
  • 第10讲 后端2
  • Elastic Stack-ES集群常用的API
  • 【重学 MySQL】十二、SQL 语言的规则与规范