140、【贪心算法】leetcode ——763. 划分字母区间(区间边界更新)(C++版本)

题目描述

140、【贪心算法】leetcode ——763. 划分字母区间(区间边界更新)(C++版本)_第1张图片
140、【贪心算法】leetcode ——763. 划分字母区间(区间边界更新)(C++版本)_第2张图片
140、【贪心算法】leetcode ——763. 划分字母区间(区间边界更新)(C++版本)_第3张图片
原题链接:763. 划分字母区间

解题思路

本题实际上是要找到某段字符串的最远边界,因此首先要确定每个字母在字符串中的最后一个位置。当每选取一个字母的时候,就会确定出该重复字母对应的最后一个位置,在向后遍历过程中,可能会有新的字母比已有的最后边界还远,就把该字母的最后一个位置更新为最远边界。当到达边界后,更新起始点,继续遍历。

class Solution {
public:
    vector<int> partitionLabels(string s) {
        if(s.size() == 1)           return {1};
        int letter[27] = {-1};
        for(int i = 0; i < s.size(); i++) {         // 记录最后一个字母出现位置
            letter[s[i] - 'a'] = i;
        }
        vector<int> res;
        int start = 0, end = 0;
        for(int i = 0; i < s.size(); i++) {
            if(letter[s[i] - 'a'] > end) {          // 找到最远边界
                end = letter[s[i] - 'a'];
            }
            if(i == end) {                          
                res.push_back(end - start + 1);     // end和start都为下标,因此需要加一表示字符个数
                start = i + 1;                      // 从下一个字符开始记录
            }
        }


        return res;
    }
};

参考文章:763.划分字母区间

你可能感兴趣的:(数据结构与算法刷题,#,贪心算法,#,哈希表,leetcode,贪心算法,c++)