题面
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
链接:https://leetcode-cn.com/problems/partition-labels/
题目分析
这道题目…自己一开始想对了,但是又想复杂了-_-记录一下
对于每一个字母而言,我们只关心最先开始出现的位置和最后出现的位置,在遍历的过程自然可以获取最先出现的位置了,所以无需记录。在拆分的过程中,我们维护一个已经遍历的字母的最后出现的位置,然后!充分利用最先开始遍历的这一个优势,如果当前位置已经等于最后的位置,说明可以截断,继续按照上述方法进行遍历。
AC代码
class Solution {
public:
vector<int> partitionLabels(string S) {
int str[26], line = 0, j = 0;
vector<int> ans;
for(int i = 0; i < S.size(); i++) {
str[S[i]-'a'] = i;
}
for(int i = 0; i < S.size(); i++) {
j = max(j, str[S[i]-'a']);
if(i == j) {
ans.push_back(i-line+1);
line = i + 1;
}
}
return ans;
}
};
感想
-_-贪心最难的就是让人想不到贪心 orz
本人水平有限,如有任何错误,恳请大家指正,不要误导他人…
错误反馈: 1004183196@qq.com