leetcode记录-340-至多包含 K 个不同字符的最长子串-双指针
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;}
}
技巧
- 滑动窗口:右指针指向当前处理位置,当满足某个条件再步进左指针。书写代码时遵循,①先处理当前右指针元素,②然后如果满足某个条件,进行处理,左指针步进,③右指针步进,④更新指标。并且外层循环一般都是
while (r<s.length())
。 - 字符计数,最好用的还是hashmap。虽然有时可以用128大小的int数组,下标表示ASCII码。
Map<Character,Integer> map=new HashMap<>();
:
① HashMap是Map接口的主要实现类
② 使用哈希算法对键去重复,效率高,但无序
③ 提供key-value的存储和查询功能
④- 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 个不同字符的最长子串-双指针相关推荐
- LeetCode 340. 至多包含 K 个不同字符的最长子串
340. 至多包含 K 个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String s, int k) ...
- LeetCode算法日记:340.至多包含K个不同字符的最长子串
340.至多包含K个不同字符的最长子串 日期:2022/7/30 题目描述:给定一个字符串 *s* ,找出 至多 包含 k 个不同字符的最长子串 *T*. 示例: 输入: s = "eceb ...
- LeetCode 340. 至多包含 K 个不同字符的最长子串 (滑动窗口)
340. 至多包含 K 个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String ss, int k ...
- 340. 至多包含K个不同字符的最长子串
340. 至多包含 K 个不同字符的最长子串 难度:中等 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k ...
- LeetCode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出 ...
- leetcode——340.至多包含 K 个不同字符的最长子串
题目--对不同字符个数进行k的限定 思路 利用双指针实现滑动窗口 滑动窗口对不同字母进行计数 移动右指针 当不同字符个数大于k 移动左指针 如何统计不同字符的个数?--哈希表的size 当出现次数为0 ...
- 【LeetCode430】至多包含 K 个不同字符的最长子串
340. 至多包含 K 个不同字符的最长子串 难度困难91收藏分享切换为英文接收动态反馈 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = " ...
- 滑动窗口—至多包含 K 个不同字符的最长子串(leetcode 340)
题目描述 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出: 3 解释: 则 T 为 &quo ...
- Leetcode——至多包含K个不同字符的最长子串
1. 至多包含两个不同字符的最长子串 (1)滑动窗口 动态地维护一个滑动窗口,如果检测到窗口内出现了超过两个不同的字符,则将窗口整体右移一格. 否则,将滑动窗口向右扩张一格. 最后返回滑动窗口的长度 ...
最新文章
- 统计局:居民用于交通活动的平均时间为38分钟
- mysql高可用+keepalived
- [转]两分钟让你明白什么是ERP!
- java内存区域及静态常量池、运行时常量池介绍
- python wmi 显卡型号_python - wmi模块学习(windwos硬件信息获取)
- html+加粗+w3c,HTML5教程:html标签属性通过w3c验证
- DeepStream3必须安装Video_Codec_SDK9
- python中stacked_栈式自动编码器(Stacked AutoEncoder)
- api wke_好用的wke浏览器代码,兼容chrome
- 14565B简单使用教程
- 算法题 动态规划-数字三角形(Python)
- 《算法基础》线性枚举(一)——最值算法
- Soot -- Soot中的一些语句细节
- Redis第六讲 Redis之List底层数据结构实现
- 全网首发宝塔最新7.9.2企业版开心版安装教程
- Style Transfer(PyTorch)
- vue基本事件domo
- 博彦科技:区块链建立优质农产品“信任链”|FISCO BCOS 2021 Meetup上海站
- 实现选项卡的自动跳转
- keras神经风格迁移_深度神经风格迁移
热门文章
- linux查询hba卡命令,如何在Linux/Unix平台查看HBA卡的WWN号
- 每日计划(2)——大二
- 梯度和梯度算子(Roberts,Sobel,Laplace)
- modprobe 及 配置文件 /etc/modprobe.conf
- 程序员的中年的危机应对手册
- centos7 完美适配QQ,TIM,微信,Foxmail,迅雷,有道云笔记,钉钉,金山词霸,爱奇艺,百度云盘,QQ音乐
- PHP读取word文档的方法分析
- 后ERP时代之协同运营管理平台实践
- excel VLOOKUP查找
- Educational Codeforces Round 90 (Rated for Div. 2)(D 思维 E 打表)