LeetCode_763. 划分字母区间
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
提示:
S的长度在[1, 500]之间。
S只包含小写字母 'a' 到 'z' 。
思路
嗐,看了解析
使用一次循环遍历把每一个字符出现的最晚位置存储下来。
再使用一次遍历
对于每个访问到的字母,可以得到这个字母最后出现的位置 end,那么该字母存在的分段的位置是肯定大于等于 end的。所以 end = max(end,last[S[i]-'a'])
当访问到end 的时候,说明当前分段访问结束。
然后使start = end + 1,继续寻找。
code
class Solution {
public:
vector<int> partitionLabels(string S) {
int last[26];
int length = S.size();
//遍历一边字符串 找到每一个字符最晚出现的位置
for(int i =0;i<length;i++)
{
last[S[i] - 'a'] = i;
}
vector<int> partition;
int start = 0,end =0;
for(int i = 0;i<length;i++)
{
end = max(end,last[S[i]-'a']);
if(i ==end)
{
partition.push_back(end-start+1);
start = end + 1;
}
}
return partition;
}
};
链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-labels