代码随想录 763. 划分字母区间

题目
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。
返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”、“defegde”、“hijhklij” 。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。
示例 2:
输入:s = “eccbbbbdec”
输出:[10]

解题思路
用lastOccurrence记录每个字符出现的最后位置,用start和end记录每个片段的起始和结束位置,如果当前位置i等于end,则说明找到一个片段,则将片段长度保存,并更新start。最后返回数组。

代码实现

class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int> result;
        
        // 记录每个字符最后出现的位置
        unordered_map<char, int> lastOccurrence;
        for (int i = 0; i < s.length(); i++) {
            lastOccurrence[s[i]] = i;
        }
        
        int start = 0; // 当前片段的起始位置
        int end = 0; // 当前片段的结束位置
        
        for (int i = 0; i < s.length(); i++) {
            end = max(end, lastOccurrence[s[i]]);
            
            if (i == end) { // 找到一个片段
                result.push_back(end - start + 1);
                start = end + 1;
            }
        }
        
        return result;
    }
};

你可能感兴趣的:(代码随想录训练营,算法,leetcode,数据结构)