晋城推广型网站开发,网站建设与网页设计论文,软件网站开发市场前景,深圳挖矿app开发题目描述
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段#xff0c;同一字母最多出现在一个片段中。 注意#xff0c;划分结果需要满足#xff1a;将所有划分结果按顺序连接#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 …题目描述
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段同一字母最多出现在一个片段中。 注意划分结果需要满足将所有划分结果按顺序连接得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。
题目分析
由于题目中规定同一字母最多出现在一个片段中因此需要找到字符串中出现的每个字母的最后一次出现的下标位置。对字符串进行一次遍历即可得到并存储在数组last_pos中。然后可以使用贪心算法思想对字符串划分出尽可能多的片段 从左至右依次访问字符串元素同时维护当前片段的开始下标start和结束下标end初始时 startend0。对于每个被访问到的字母char从last_pos中获取当前字母的最后一次出现的下标位置如果其最后出现的位置大于当前片段边界end则更新end否则不更新来确保每个字母在同一个片段里。当访问到下标等于当前片段边界end时当前片段访问结束当前片段的下标范围是 [start,end]长度为end−start1将当前片段的长度添加到返回值数组中然后更新下一个片段的startend1继续处理下一个片段。重复上述过程直到方问完字符串的全部元素。
Code
class Solution {
public:vectorint partitionLabels(string s) {int last_pos[26];int len s.size();for (int i 0; i len; i) {last_pos[s[i] - a] i;}vectorint ans;int start 0,end 0;for (int i 0; i len; i) {if (end last_pos[s[i] - a]) {end last_pos[s[i] - a];}if (end i) {ans.emplace_back(end - start 1);start end 1;}}return ans;}
};