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

字符串-至多包含K种字符的子串中最长子串(mid)

一、题目描述

二、解题思路

借鉴以下题目思想,使用双指针,外层循环右侧指针移动,内存循环左侧指针移动

字符串-最长不含重复字符的子字符串(mid)-CSDN博客文章浏览阅读622次,点赞17次,收藏4次。java刷题:求最长不含重复字符的子字符串,使用双指针结合题目要求,减少左指针的移动次数,降低程序执行复杂度,这个题目很好,值得好好理解。https://blog.csdn.net/hehe_soft_engineer/article/details/139320167题目要求K种字符,则设置一个规模大小为K的hashset,该hashset记录当前至多包含K种字符的子串所含的字符类型。

1.当hashset所含字符种类小于K时,右指针++。

2.当hashset所含字符种类等于K时:

        2.1当右指针指向的字符在hashset中,右指针++

        2.2当右指针指向字符不在hashset中,找到当前子字符串中最久未出现的字符,定位到字符位置,将左指针指向该字符后一个位置,右指针++,以实现更新至多包含K种字符的子串。

 3.如果当前子串长度变长了,则更新记录最长长度的变量。

三、代码实现

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param s string字符串 * @param k int整型 * @return int整型*/public int longestSubstring (String s, int k) {// 设置left和right双指针int left=0,right=0;HashSet<Character> charset=new HashSet<>();charset.add(s.charAt(0));int maxLen=0;for(;right<s.length();right++){if(charset.contains(s.charAt(right))){//此时不做操作}else{if(charset.size()<k){//当前字符种类并没有达到k,添加字符种类charset.add(s.charAt(right));}else{//此时需要从右侧开始找到第k次读取的字符(替换出set)int icounter=0;int leftdeletIndex=right-1;HashSet<Character> tmpcharset=new HashSet<>();while(leftdeletIndex>=left){if(!tmpcharset.contains(s.charAt(leftdeletIndex))){tmpcharset.add(s.charAt(leftdeletIndex));}if(tmpcharset.size()==k){//此时leftdeletIndex就是需要移除的字符tmpcharset.clear();break;}leftdeletIndex--;}left=leftdeletIndex+1;charset.remove(s.charAt(leftdeletIndex));charset.add(s.charAt(right));}}maxLen=maxLen>(right-left+1)?maxLen:(right-left+1);}return maxLen;}
}

四、刷题链接

至多包含K种字符的子串_牛客题霸_牛客网

http://www.lryc.cn/news/359282.html

相关文章:

  • Docker从安装开始精通
  • MFC:初步理解序列化与反序列化(含代码实现)
  • python程序控制结构
  • 【GD32】04 - Timer定时器
  • Golang | Leetcode Golang题解之第123题买卖股票的最佳时机III
  • Leetcode2028. 找出缺失的观测数据
  • 如何在CentOS中合理划分磁盘空间以优化系统性能
  • 算法(十一)贪婪算法
  • Rust之函数式语言特性:迭代器和闭包(一):概述
  • 配置资源管理
  • unity2020打包webGL时卡进程问题
  • 云原生架构相关技术_3.无服务器技术
  • Leetcode:Z 字形变换
  • Python 3 判断文件是否存在
  • (深度学习记录)第TR3周:Transformer 算法详解
  • 谷神前端组件增强:自定义列
  • 31-ESP32-S3-WIFI篇-02 Event Group (事件标记组)
  • 构建企业级AI私有知识库
  • C语言王国——杨氏矩阵
  • 陪玩小程序都需要怎么做?
  • postgressql——子事务可见性判断 性能问题(8)
  • 20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头
  • 从0开始学统计-什么是回归?
  • Element-ui使用上传时弹框选择文件类型
  • 原生小程序一键获取手机号
  • ARM虚拟机安装OMV
  • 【协议开发系列】梳理关于TCP和UDP两种协议的区别和使用场景
  • vue blob实现自定义多sheet数据导出到excel文件
  • Python—面向对象小解(3)
  • Nginx超时时间