leetcode 划分单词区间 中等

Posted Wh1t3zZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 划分单词区间 中等相关的知识,希望对你有一定的参考价值。

 

 

对每个字母,都有一个最左边界与最右边界,答案就是这些边界区间进行合并。

class Solution {
public:
    vector<int> partitionLabels(const string &s) {
        vector<pair<int, int>> idx(26, {INT_MAX, INT_MIN}); // 每一种字母的最左边界与最右边界
        for(int i = 0; i < s.size(); ++ i) {
            idx[s[i] - \'a\'].first = min(idx[s[i] - \'a\'].first, i);
            idx[s[i] - \'a\'].second = max(idx[s[i] - \'a\'].second, i);
        }
        sort(idx.begin(), idx.end(), [](const pair<int, int> &a, const pair<int, int> &b) {
            return a.first != b.first ? a.first < b.first : a.second < b.second;
        });
        vector<int> ret;
        int beg = -1, end = -1;
        for(int i = 0; i < 26 && idx[i].first != INT_MAX; ++ i) {
            if(idx[i].first < end) {
                end = max(end, idx[i].second);
            } else {
                if(beg != -1) ret.emplace_back(end - beg + 1);
                beg = idx[i].first;
                end = idx[i].second;
            }
        }
        ret.emplace_back(end - beg + 1);
        return ret;
    }
};

 

但其实可以不用进行 sort (虽然这个 sort 也没什么复杂度).. 记录每个字母的最右边界即可,然后最左边界靠再次枚举来获得。

class Solution {
public:
    vector<int> partitionLabels(const string &s) {
        int last[26];
        for(int i = 0; i < s.size(); ++ i) {
            last[s[i] - \'a\'] = i;
        }
        vector<int> ret;
        int beg = -1, end = -1;
        for(int i = 0; i < s.size(); ++ i) {
            if(end >= i) {      // 注意是 >=, 不是 >, 因为到后面的 i 本身就可能为 last[s[i] - \'a\'], 并且是 end
                end = max(end, last[s[i] - \'a\']);
            } else {
                if(beg != -1) ret.emplace_back(end - beg + 1);
                beg = i;
                end = last[s[i] - \'a\'];
            }
        }
        ret.emplace_back(end - beg + 1);
        return ret;
    }
};

 

以上是关于leetcode 划分单词区间 中等的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 763 划分字母区间

LeetCode:划分字母区间763

leetcode中等剑指 Offer 33二叉搜索树的后序遍历序列

贪心算法:划分字母区间

贪心热门问题8:划分字母区间

leetcode中等2080区间内查询数字的频率