【面试系列】划分字母区间

题意:
原题链接

思路:
由于每个字母只能被划分在一个区间内,所以我们可以考虑这个字母的区间范围。
这样就得到了至多 26 26 26个字母的区间范围。

所以有区间范围重叠的字母必须都被分到一个区间内,因此这个问题就转换为合并区间问题。

排序后贪心合并即可。

代码:

class Solution {
    
    
public:
    
    vector<int> partitionLabels(string s) {
    
    
        const int INF = 0x3f3f3f3f;
        int n = s.size();
        vector<vector<int>> seg(26, vector<int>(2, INF));
        
        for(int i = n - 1; i >= 0; --i) {
    
    
            int id = s[i] - 'a';
            if(seg[id][0] == INF) seg[id][0] = seg[id][1] = i;
            else seg[id][0] = min(seg[id][0], i);
        }
        
        sort(seg.begin(), seg.end(), [](const vector<int> &A, const vector<int> &B) {
    
    
           return A[0] < B[0]; 
        });
        
        vector<int> res;
        for(int i = 0; i < 26 && seg[i][0] != INF; ++i) {
    
    
            int l = seg[i][0], r = seg[i][1];
            int j = i + 1;
            while(j < 26 && seg[j][0] != INF && seg[j][0] <= r) {
    
    
                r = max(r, seg[j][1]);
                j += 1;
            }
            res.push_back(r - l + 1);
            i = j - 1;
        }
        
        return res;
    }
};

おすすめ

転載: blog.csdn.net/weixin_43900869/article/details/119799618