大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

这道题目考察的是字符串的处理和贪心算法。

题目解答方法的文字分析

为了满足题目的要求,我们需要找到一种合理的分组方式,使得每个分组中的字母都不相同,同时分组数尽可能多。我们可以使用贪心算法来解决这个问题。

我们可以遍历字符串 s,并使用一个哈希表来记录每个字符最后出现的位置。这样,在遍历字符串 s 的过程中,我们可以得知当前字符最后一次出现的位置,从而可以得到一个分组的范围。

具体做法如下:

  1. 首先,遍历字符串 s,记录每个字符最后出现的位置,存储在一个哈希表中。
  2. 然后,再次遍历字符串 s,同时使用两个指针 start 和 end 来表示当前分组的范围。对于当前遍历到的字符,更新 end 指针为当前字符最后出现的位置和 end 中的较大值。
  3. 如果当前遍历的位置等于 end,说明当前字符是当前分组的最后一个字符,这时可以得到一个分组,并计算当前分组的长度(即 end - start + 1)。
  4. 将 start 指针更新为 end + 1,继续遍历剩下的字符,直到遍历完整个字符串 s。

本题解析所用的编程语言

C++

完整且正确的编程代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型vector
     */
    vector<int> partitionLabels(string s) {
        vector<int> lastOccur(26, -1); // 记录每个字符最后出现的位置
        int n = s.size();
        for (int i = 0; i < n; ++i) {
            lastOccur[s[i] - 'a'] = i;
        }

        vector<int> partitions; // 保存每个分组的长度
        int start = 0; // 当前分组的起始位置
        int end = 0; // 当前分组的结束位置

        for (int i = 0; i < n; ++i) {
            end = max(end, lastOccur[s[i] - 'a']);
            if (i == end) {
                partitions.push_back(end - start + 1);
                start = end + 1;
            }
        }

        return partitions;
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!