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 划分单词区间 中等的主要内容,如果未能解决你的问题,请参考以下文章