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

LeetCode763. 划分字母区间(2024冬季每日一题 23)

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”、“defegde”、“hijhklij” 。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。

示例 2:

输入:s = “eccbbbbdec”
输出:[10]

提示:

1 < = s . l e n g t h < = 500 1 <= s.length <= 500 1<=s.length<=500
s 仅由小写英文字母组成


思路:

  • 初始化遍历字符串中的字符,求出每个字符在字符串中最右的下标
  • 遍历字符串中的字符,确定一个区间,使得区间中的字串,满足区间内每一个字母最只出现在当前区间中
    • 用 l/r 标识当前区间的左/右边界下标,如果当前字符的下标 > r,则将 [l.r] 加入 res 结果中,更新 l 和 r
    • 否则,更新 r 下标
  • 对于 r,如果当前字符在整个字符串中的最右边界 > 当前子区间的 r 边界,则用其更新 r
class Solution {
public:
    int rmax[30];
    vector<int> partitionLabels(string s) {
        int n = s.size();
        for(int i = 0; i < n; i++){
            rmax[s[i]-'a'] = max(rmax[s[i]-'a'], i);
        }
        vector<int> res;
        int l = -1, r = -1;
        for(int i = 0; i < n; i++){
            if(i > r){
                if(i) res.push_back(r - l + 1);
                l = i;
            }
            r = max(r, rmax[s[i]-'a']);
        }
        res.push_back(r - l + 1);
        return res;
    }
};

http://www.kler.cn/a/421040.html

相关文章:

  • 产品经理的投资理财课:开放式基金和封闭式基金
  • React16搭建-GPT回答
  • Hive分区裁剪(Partition Pruning)详解
  • 单机环境下Caffeine和Redis两级缓存的实现与问题解决
  • 算法训练营day28(回溯算法04:复原IP地址,子集,子集2)
  • MongoDB集群分片安装部署手册
  • 基于STM32的气体泄漏检测器
  • 在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)
  • lambda strem流表达式处理工具
  • 第10章 大模型的有害性(下)
  • 初始化webpack应用示例
  • 基于python的某音乐网站热门歌曲的采集与分析,包括聚类和Lda主题分析
  • QT5.14 QML串口助手
  • Docker快速部署RabbitMq
  • 【Vue3】Vue3与React的路由管理对比:详细解析与实战案例!
  • WPF+LibVLC开发播放器-LibVLC在C#中的使用
  • 高速定向广播声光预警系统赋能高速安全管控
  • 代码随想录算法训练营第三十五天 | 01背包问题(二维,一维) | 416. 分割等和子集 | 1049.最后一块石头的重量II
  • JVM 为什么需要类加载机制?深入浅出 JVM 类加载原理
  • GCP : Virtual Private Cloud - 如何构建Nat Gateway
  • 云原生后端:解锁高效可扩展应用的魔法世界
  • Redis自学之路—高级特性(实现消息队列)(七)
  • 安装 pytorch lighting
  • 简单无注册中心本地ip轮训网关实现
  • 【合作原创】使用Termux搭建可以使用的生产力环境(二)
  • (笔记)vue3引入Element-plus