题意:
原题链接
思路:
由于每个字母只能被划分在一个区间内,所以我们可以考虑这个字母的区间范围。
这样就得到了至多 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;
}
};