字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

    示例:

    1. 输入:S = "ababcbacadefegdehijhklij"
    2. 输出:[9,7,8]
    3. 解释:
    4. 划分结果为 "ababcbaca", "defegde", "hijhklij"
    5. 每个字母最多出现在一个片段中。
    6. "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

    提示:

    • S的长度在[1, 500]之间。
    • S只包含小写字母 'a''z'

    题解:

    重点是用数组来记录每个单词最后出现的位置更新right,和贪心好像没有什么关系

    class Solution {
    public:
        //这题用一个数组记录每个位置的字母出现的最后位置可以让问题简单
        vector<int> partitionLabels(string s) {
            vector<int>ans;
            int a[27]={0};
            for (int i = 0; i < s.size(); i++){
                a[s[i]-'a']=i;
            }
            int left = 0;
            int right = 0;
            for (int i = 0; i < s.size(); i++)
            {
                right=max(right,a[s[i]-'a']);
                if(i==right){
                    ans.push_back(right-left+1);
                    left=right+1;
                }
            }
            return ans;
        }
    };