leetcode热题100(763. 划分字母区间) c++

链接:763. 划分字母区间 - 力扣(LeetCode)

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

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

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

示例 1:

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

示例 2:

复制代码
输入:s = "eccbbbbdec"
输出:[10]

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母组成

题意

每个相同的字母只能出现在同一个区间中,尽可能划分尽多的区间。

思路

只要保证每个相同字母头尾相连就是一个划分区间片段,那么我们可以提前记录一下每个字母最后一次出现的问题,然后我们只需要枚举一下每个字母的起始位置,然后起始位置和最后出现的位置那么就是一个最长的区间。在枚举的过程中只要维护一下每个字母的最长的右端点即可

代码

cpp 复制代码
class Solution {
public:
    vector<int> partitionLabels(string s) {
        int n = s.size();
        vector<int> res;
        unordered_map<char,int> mp;
        for(int i=0;i<n;i++){
            mp[s[i]]=i;
        }
        int l=0,r=0;
        for(int i=0;i<n;i++){
            if(r==0){
              l=i;  
              r=mp[s[i]];
            }else{  //维护最大右端点位置
                r = max(mp[s[i]],r);
            }
            if(i>=r){   //该区间是满足题意的一个片段
                res.push_back(r-l+1);
                l=0;r=0;
            }
        }
        return res;
    }
};
相关推荐
2401_872418785 小时前
算法入门:数据结构-堆
数据结构·算法
王老师青少年编程5 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝案例实践1)
c++·csp·高频考点·信奥赛·提高组·搜索剪枝·小木棍
xwz小王子6 小时前
手术机器人登上Science Robotics:2毫米纤细手臂,从3厘米切口完成腰椎神经减压
算法·机器人
黎阳之光7 小时前
视频孪生智护供水生命线:黎阳之光赋能医疗与园区水务高质量升级
运维·物联网·算法·安全·数字孪生
Black蜡笔小新7 小时前
自动化AI算法训练服务器DLTM制造业AI质检工作站助力制造业实现AI智检
人工智能·算法·自动化
嵌入式小能手7 小时前
飞凌嵌入式ElfBoard-进程间的通信之命名管道
linux·服务器·算法
啦哈拉哈8 小时前
Leetcode题解记录-hot100(81-100)
算法·leetcode·职场和发展
csdn_aspnet8 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
王老师青少年编程8 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝核心思想 )
c++·dfs·csp·信奥赛·搜索剪枝·搜索优化
一拳一个呆瓜8 小时前
【STL】使用 C++ 标准库标头
c++·stl