给你一个字符串 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;
}
};