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

【每日一题】LeetCode 3714. 最长的平衡子串 II

给你一个只包含字符 abc 的字符串 \(s\)

如果一个子串中所有不同字符出现的次数都相同,则称该子串为平衡子串。

请返回 \(s\) 的最长平衡子串的长度。

子串是字符串中连续的、非空的字符序列。


AC Link

对每个平衡子串:

  • 包含一种字符。最长的平衡子串贡献来源于极长的单一字符串。如 aaabbbbbcccc 中极长的单一字符串为 aaabbbbbcccc

用单次 for 循环维护极长的子串长度,遇到不同的串则把长度清空。每次更新后取最大值。

  • 包含两种字符。将第三种字符作为分隔符,处理在每个分隔符之间的串。利用子串与到左右端点前缀的关系,维护两种字符在前缀的出现次数之差,只要差相同,即代表在这个区间内两种字符出现次数相同。记录这个差对应的第一个下标,每次再遇到这个差,都用当前的下标和第一个下标取长度。

std::map 分别存出现 b - ac - ba - c 的最早下标。遇到第三种字符就置为初始状态。需要注意边界问题:前缀为空时出现次数之差为零,这个需要存进去。

  • 包含三种字符。依旧利用每个前缀字符出现次数之差,维护 b - ac - a 的次数。每次出现 a 就让两个次数减一,出现 bc 就让对应的次数加一。

std::pair 储存。每个这样的 std::pair 对应一个最早的下标,可以用 std::map<std::pair<int, int>, int> 维护。

时间复杂度 \(O(n \log n)\),空间复杂度 \(O(n)\)


class Solution {
public:int longestBalanced(string s) {int ans = 0;int n = s.size();{map<pair<int, int>, int> first;int b = 0, c = 0;first[make_pair(0, 0)] = -1;for (int i = 0; i < n; ++i) {if (s[i] == 'a') {--b, --c;} else if (s[i] == 'b') {++b;} else {++c;}if (first.contains(make_pair(b, c))) {ans = max(ans, i - first[make_pair(b, c)]);} else {first[make_pair(b, c)] = i;}}}{map<int, int> first_ab, first_bc, first_ca;first_ab[0] = -1;first_bc[0] = -1;first_ca[0] = -1;int ab = 0, bc = 0, ca = 0;for (int i = 0; i < n; ++i) {if (s[i] == 'a') {bc = 0;first_bc.clear();first_bc[0] = i;ab--;if (first_ab.contains(ab) == false) {first_ab[ab] = i;}ca++;if (first_ca.contains(ca) == false) {first_ca[ca] = i;}ans = max({ans, i - first_ab[ab], i - first_ca[ca]});}if (s[i] == 'b') {ca = 0;first_ca.clear();first_ca[0] = i;ab++;if (first_ab.contains(ab) == false) {first_ab[ab] = i;}bc--;if (first_bc.contains(bc) == false) {first_bc[bc] = i;}ans = max({ans, i - first_ab[ab], i - first_bc[bc]});}if (s[i] == 'c') {ab = 0;first_ab.clear();first_ab[0] = i;bc++;if (first_bc.contains(bc) == false) {first_bc[bc] = i;}ca--;if (first_ca.contains(ca) == false) {first_ca[ca] = i;}ans = max({ans, i - first_bc[bc], i - first_ca[ca]});}}}{int a = 0, b = 0, c = 0;for (int i = 0; i < n; ++i) {if (s[i] == 'a') {a++;b = 0;c = 0;}if (s[i] == 'b') {b++;c = 0;a = 0;}if (s[i] == 'c') {c++;a = 0;b = 0;}ans = max({ans, a, b, c});}}return ans;}
};
http://www.jsqmd.com/news/379626/

相关文章:

  • Vue3解析学习 - handlers 模块
  • 寒假学习笔记1.31
  • 寒假学习笔记1.30
  • 探索 Java 中的新 HTTP 客户端
  • P2698 [USACO12MAR] Flowerpot S
  • 中国移动(600941)价值投资深度研究报告 2026.2.13
  • 免费,在线pdf转jpg的链接。
  • 深入解析:Android平板备份到计算机
  • Winter Vacation 2026 - -Klsw
  • 小程序环境+基础页面
  • 三维点云处理技术和深度学习在点云处理中的应用-02:三维点云表征概述
  • 信息论与编码篇---N次拓展信道
  • 信息论与编码篇---积信道
  • 信息论与编码篇---可逆矩阵信道
  • Spark大数据处理:技术、应用与性能优化【1.2】
  • 有限元模型可视化:两套独立Python代码实现带载荷与纯几何对比
  • 6个提示词,能把混乱的剪辑变成专业策略
  • 26.2.12
  • 完整教程:leetcode算法(112.路径总和)
  • 使用Qwen Code的Skills能力重塑工作流 - yi
  • 大数据ETL工具比较:Sqoop vs Flume vs Kafka
  • Django 中间件
  • temperature定义与使用
  • Google API 教程
  • AI编程工具在高可用架构设计中的应用:从故障注入到灾备方案生成实战
  • 视频转换器HD Video Converter Factory 28.6 便携版
  • XML Schema 复合空元素
  • 2001-2024年上市公司媒体关注度数据+Stata代码
  • 必看!2026年琼海海鲜推荐榜单,探索高性价比家庭聚餐海鲜店与知名夜宵选择
  • 企业AI伦理准则制定中的跨部门协作:AI应用架构师的协调技巧