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

386 · Longest Substring with At Most K Distinct Characters最多有k个不同字符的最长子字符串(滑动窗口)

链接:LintCode 炼码 - 更高效的学习体验!

https://mp.weixin.qq.com/s?__biz=MzU2OTUyNzk1NQ==&mid=2247491103&idx=1&sn=8d9a2ed68a7dd31bb2aeb50ffe8fa4c8&source=41#wechat_redirect

题解:

class Solution { public: /** * @param s: A string * @param k: An integer * @return: An integer */ int lengthOfLongestSubstringKDistinct(string &s, int k) { // write your code here if (s.size() <= 0) { return 0; } int right = 0; int left = 0; int max_len = 0; std::unordered_map<char, int> table; while (right < s.size()) { ++table[s[right]]; if (table.size() > k) { while (left <s.size() && table.size() > k) { if (--table[s[left]] == 0) { table.erase(s[left]); } ++left; } } max_len = max(max_len, right-left+1); ++right; } return max_len; } };
class Solution { public: /** * @param s: A string * @param k: An integer * @return: An integer */ int lengthOfLongestSubstringKDistinct(string &s, int k) { // write your code here int len = s.size(); if (len <= 0) { return 0; } unordered_map<char, int> table; int j = 0; int result = INT_MIN; for (int i = 0; i < s.size(); ++i) { while (j < s.size() && table.size() <= k) { ++table[s[j]]; ++j; } if (table.size() > k) { result = max(result, j-i-1); } else if (table.size() <= k) { result = max(result, j-i); } if (--table[s[i]] == 0) { table.erase(s[i]); } } return result; } };

while循环退出时,如果是因为table.size() > k(即插入后不同字符数超过k),那么j已经自增,指向了非法窗口的下一个位置。此时,合法的窗口应该是[i, j-2],长度为(j-2) - i + 1 = j - i - 1。因此需要-1

如果while退出是因为j == s.size()或插入后仍满足table.size() <= k,那么窗口[i, j-1]是合法的,长度直接为j - i

http://www.cnnetsun.cn/news/3563910.html

相关文章:

  • 不群发、不买链接、不写客座文章——我只靠一条原创数据拿到了200条外链
  • 第三章 镜像仓库总结-001篇
  • smsBomb配置完全指南:从配置文件到API密钥的详细设置
  • 运维工程师转型渗透测试:思维重塑与6-9个月实战路线图
  • GameVault多平台支持:Windows与Linux游戏兼容性终极指南 [特殊字符]
  • Claude Code实战避坑指南:7大核心痛点与解决方案
  • 【WorkBuddy从入门到精通实战教程】使用手册 第 5 章 WorkBuddy加载一个真正用得上的 Skill
  • shell数组的一些总结
  • 告别文献焦虑✅Okbiye千万文献库+学术翻译!搞定论文参考文献、外文研读全流程
  • 递归对抗拓扑学(RAT)主纤维丛建模认知冲突完整框架(世毫九实验室原创研究)
  • FossFLOW架构图工具深度解析:如何构建专业级等距可视化系统
  • HarmonyOS应用开发实战:小事记 - 网络请求封装:请求/响应拦截器、超时重试、取消请求
  • M12 B-Code(B编码)5芯连接器完整解析
  • SpringBatch批处理实战:架构解析与性能优化
  • 3个策略让cJSON在工业控制系统中实现零内存泄漏的JSON处理
  • HDMI矩阵与EDID管理在无纸化会议中的应用
  • 终极指南:Magisk技术架构深度解析与性能优化策略
  • 2026横评:3大宁波周末语文小升初机构全面评测
  • 百考通一键生成:AI赋能开题报告,让学术研究起步更高效
  • Laravel ER Diagram Generator 终极快速入门指南:3分钟生成数据库关系图
  • 原神抽卡数据分析:如何用开源工具永久保存你的欧皇时刻?
  • MTProxy动态IP挑战:如何实现17秒自动重连与智能DNS解析
  • 工控人转型C#上位机开发:从PLC到高薪的实战指南
  • TMS320F2802x SCI与I2C寄存器深度解析与实战配置指南
  • 5分钟掌握Jessibuca Pro:免费打造专业级Web直播播放器的终极指南
  • Mindustry终极指南:5步掌握自动化塔防策略游戏
  • Apple GPT与Ajax框架:苹果AI技术解析与应用前景
  • 3步完成Armbian系统安装:将电视盒子变身高性能Linux服务器
  • GLM-4.5-Air大语言模型:免费开源AI助手的终极入门指南
  • Sulphur-2-Base-GGUF终极指南:5步掌握无审查AI视频生成技术