代码随想录-250720-划分字母区间
划分字母区间
题目内容
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 "ababcc" 能够被分为 ["abab","cc"],但类似["aba","bcc"] 或 ["ab","ab","cc"] 的划分是非法的。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。
返回一个表示每个字符串片段的长度的列表。
输入描述
一个字符串 s
输出描述
一个表示每个字符串片段的长度的列表
样例1
输入
ababcbacadefegdehijhklij
Copy
输出
9 7 8
Copy
说明
划分结果为 "���������ababcbaca"、"�������defegde"、"ℎ��ℎ����hijhklij" 。
每个字母最多出现在一个片段中。
像 "����������������ababcbacadefegde", "ℎ��ℎ����hijhklij" 这样的划分是错误的,因为划分的片段数较少。
样例2
输入
eccbbbbdec
输出
10
解答:
从左至右记录每个字符的最大位置即可。重新遍历时如果最大位置超出范围就延长。
时间复杂度O(n),空间复杂度O(1)
#include<bits/stdc++.h>
using namespace std;
int main(){vector<int>right(26,-1);string s;cin>>s;int n=s.size();for(int i=0;i<n;i++){right[s[i]-'a']=i;}vector<int>ans;int l=0,r=0;for(int i=0;i<n;i++){if(i<=r){r=max(r,right[s[i]-'a']);}else{ans.push_back(r-l+1);l=i;r=right[s[i]-'a'];}}ans.push_back(r-l+1);cout<<ans[0];for(int i=1;i<ans.size();i++){cout<<" "<<ans[i];}cout<<endl;return 0;
}