340.至多包含 K 个不同字符的最长子串

思路

寻找字符串满足某个条件的子串,考虑双指针+滑动窗口思想(右指针一直前进,当遇到某个条件成立/不成立,更新左指针,然后右指针接着前进)。首先左右指针从0开始,右指针步进,用hashmap存储俩指针区间内每个字符最新出现的下标,当hashmap中元素个数大于要求的k时,证明元素多了,上一个子串寻找结束,更新左指针开始下一个子串寻找(舍弃目前区间内最右下标最小的舍弃,以获取最大长度),直到到最后。

代码

public class T340 {public int lengthOfLongestSubstringKDistinct(String s, int k) {//滑动窗口:右指针指向当前处理位置,左指针根据条件步进//字符串寻找各种类型的子串 均可以考虑是否可以滑动窗口,右指针一直前进,当遇到某个条件成立/不成立,更新左指针,然后右指针接着前进。//此题需要寻找字符串至多包含k个字符的最长子串,返回长度即可。//需要记录目前最长的,步进中不断更新,每次新的左指针变化前更新。//字符计数,最好用的还是hashmap,而此题每次更新串都是舍弃最早结束的字符。if (k==0||s.length()==0) return 0;int l=0,r=0;int len=0;Map<Character,Integer> map=new HashMap<>();while (r<s.length()){//先处理目前的r上的元素map.put(s.charAt(r),r);//当满足某个条件,需要暂时停下处理l指针if (map.size()>k){int min=Collections.min(map.values());map.remove(s.charAt(min));l=min+1;}//正常步进r++;//更新指标len=len>r-l?len:r-l;}return len;}
}

技巧

  1. 滑动窗口:右指针指向当前处理位置,当满足某个条件再步进左指针。书写代码时遵循,①先处理当前右指针元素,②然后如果满足某个条件,进行处理,左指针步进,③右指针步进,④更新指标。并且外层循环一般都是while (r<s.length())
  2. 字符计数,最好用的还是hashmap。虽然有时可以用128大小的int数组,下标表示ASCII码。
  3. Map<Character,Integer> map=new HashMap<>();
    ① HashMap是Map接口的主要实现类
    ② 使用哈希算法对键去重复,效率高,但无序
    ③ 提供key-value的存储和查询功能
  4. Java Collections类操作:Collections.min(map.values());
    reverse(List list):对指定 List 集合元素进行逆向排序。
    sort(List list):根据元素的自然顺序对指定 List 集合的元素按升序进行排序。
    Object max(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素。
    Object min(Collection coll):根据元素的自然顺序,返回给定集合中的最小元素。
    Object max(Collection coll, Comparator comp):根据 Comparator 指定的顺序,返回给定集合中的最大元素。
    int frequency(Collection c, Object o):返回指定集合中指定元素的出现次数。
    int indexOfSubList(List source, List target):返回子 List 对象在父 List 对象中第一次出现的位置索引;如果父 List 中没有出现这样的子 List,则返回 -1。
    int lastIndexOfSubList(List source, List target):返回子 List 对象在父 List 对象中最后一次出现的位置索引;如果父 List 中没有岀现这样的子 List,则返回 -1。

leetcode记录-340-至多包含 K 个不同字符的最长子串-双指针相关推荐

  1. LeetCode 340. 至多包含 K 个不同字符的最长子串

    340. 至多包含 K 个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String s, int k) ...

  2. LeetCode算法日记:340.至多包含K个不同字符的最长子串

    340.至多包含K个不同字符的最长子串 日期:2022/7/30 题目描述:给定一个字符串 *s* ,找出 至多 包含 k 个不同字符的最长子串 *T*. 示例: 输入: s = "eceb ...

  3. LeetCode 340. 至多包含 K 个不同字符的最长子串 (滑动窗口)

    340. 至多包含 K 个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String ss, int k ...

  4. 340. 至多包含K个不同字符的最长子串

    340. 至多包含 K 个不同字符的最长子串 难度:中等 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k ...

  5. LeetCode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出 ...

  6. leetcode——340.至多包含 K 个不同字符的最长子串

    题目--对不同字符个数进行k的限定 思路 利用双指针实现滑动窗口 滑动窗口对不同字母进行计数 移动右指针 当不同字符个数大于k 移动左指针 如何统计不同字符的个数?--哈希表的size 当出现次数为0 ...

  7. 【LeetCode430】至多包含 K 个不同字符的最长子串

    340. 至多包含 K 个不同字符的最长子串 难度困难91收藏分享切换为英文接收动态反馈 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = " ...

  8. 滑动窗口—至多包含 K 个不同字符的最长子串(leetcode 340)

    题目描述 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出: 3 解释: 则 T 为 &quo ...

  9. Leetcode——至多包含K个不同字符的最长子串

    1. 至多包含两个不同字符的最长子串 (1)滑动窗口 动态地维护一个滑动窗口,如果检测到窗口内出现了超过两个不同的字符,则将窗口整体右移一格. 否则,将滑动窗口向右扩张一格. 最后返回滑动窗口的长度 ...

最新文章

  1. 统计局:居民用于交通活动的平均时间为38分钟
  2. mysql高可用+keepalived
  3. [转]两分钟让你明白什么是ERP!
  4. java内存区域及静态常量池、运行时常量池介绍
  5. python wmi 显卡型号_python - wmi模块学习(windwos硬件信息获取)
  6. html+加粗+w3c,HTML5教程:html标签属性通过w3c验证
  7. DeepStream3必须安装Video_Codec_SDK9
  8. python中stacked_栈式自动编码器(Stacked AutoEncoder)
  9. api wke_好用的wke浏览器代码,兼容chrome
  10. 14565B简单使用教程
  11. 算法题 动态规划-数字三角形(Python)
  12. 《算法基础》线性枚举(一)——最值算法
  13. Soot -- Soot中的一些语句细节
  14. Redis第六讲 Redis之List底层数据结构实现
  15. 全网首发宝塔最新7.9.2企业版开心版安装教程
  16. Style Transfer(PyTorch)
  17. vue基本事件domo
  18. 博彦科技:区块链建立优质农产品“信任链”|FISCO BCOS 2021 Meetup上海站
  19. 实现选项卡的自动跳转
  20. keras神经风格迁移_深度神经风格迁移

热门文章

  1. linux查询hba卡命令,如何在Linux/Unix平台查看HBA卡的WWN号
  2. 每日计划(2)——大二
  3. 梯度和梯度算子(Roberts,Sobel,Laplace)
  4. modprobe 及 配置文件 /etc/modprobe.conf
  5. 程序员的中年的危机应对手册
  6. centos7 完美适配QQ,TIM,微信,Foxmail,迅雷,有道云笔记,钉钉,金山词霸,爱奇艺,百度云盘,QQ音乐
  7. PHP读取word文档的方法分析
  8. 后ERP时代之协同运营管理平台实践
  9. excel VLOOKUP查找
  10. Educational Codeforces Round 90 (Rated for Div. 2)(D 思维 E 打表)