title: 763. Partition Labels
tags:
- Interval
categories: leetcode
comments: false
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> ans;
int n= s.size();
// ็ตฑ่จๅๅญๅ
ๅบ็พ็็ดขๅผๅ้
unordered_map<char,pair<int,int>> mp;
vector<vector<int>> intervals;
for(int i = 0;i<n ;++i){
if(mp.find(s[i])==mp.end()){
mp[s[i]] = {i,i};
}
else{
mp[s[i]].second = i;
}
}
for(auto m:mp){
intervals.push_back({m.second.first,m.second.second});
}
// ๅๅฐๅๅ้็ๆฏๅฆๆ็ก้็๏ผ่ฅๅฏ้็ไฝฟๅ
ถ้็่ฎๆไธๅๅคงๅ้๏ผไธฆๅฐๆพ้้็็ๅคงๅ้็้ทๅบฆ
sort(intervals.begin(), intervals.end(), [](vector<int> &a, vector<int> &b){
return a[0]<b[0];
});
vector<vector<int>> ret;
ret.push_back({intervals[0][0], intervals[0][1]});
for(int i=1;i<intervals.size() ;++i){
vector<int> & cur = intervals[i];
// non-overlap
if(cur[0] > ret.back()[1]){
ans.push_back(ret.back()[1] - ret.back()[0]+1);
ret.push_back(cur);
}
// overlap
else{
ret.back()[1] = max(ret.back()[1], cur[1]);
}
}
ans.push_back(ret.back()[1] - ret.back()[0]+1);
return ans;
}
};
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> ret;
int n = s.size(), start = 0, last = 0;
unordered_map<char, int> m;
for (int i = 0; i < n; ++i) m[s[i]] = i;
for(int i=0;i<n;++i){
last = max(last, m[s[i]]);
if (i == last) {
ret.push_back(i - start + 1);
start = i + 1;
}
}
return ret;
}
};
- time complexity
O(n)
- space complexity
O(n)