【代码随想录day 30】 力扣 763. 划分字母区间
视频讲解:https://www.bilibili.com/video/BV18G4y1K7d5/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html#%E6%80%9D%E8%B7%AF
力扣题目:https://leetcode.cn/problems/partition-labels/
这道题我也做出来了,但是思想很麻烦:
- 统计多少字母并且其起始位置
- 按起始顺序升序排列
- 找到第一个存在的数组开始遍历,如果和前一个有交集,upper取max。
- 如果没有交集,upper即为截断点,lower和upper更新。
但是卡哥的思想就很简洁,不用考虑起始位置,只需要考虑右边界的最大值即可,
5. 每次遍历取最大值的右边界
6. 如果i 遍历到了右边界就说明该截断了,这里很精妙***
7. 存入截断值,更新left,right在每次更新数的时候会更新,所以不用更新
class Solution {
public:vector<int> partitionLabels(string s) {int hash[27] = {0};vector<int> result;//遍历字符串统计最远值for(int i = 0; i < s.size(); ++i){hash[s[i] - 'a'] = i;}//初始化左右边界int left = 0;int right = 0;for(int i = 0; i < s.size(); ++i){//每次遍历取右边界最大值right = max(right, hash[s[i] - 'a']);//如果遍历到最大值时候说明该截断了if(i == right){result.push_back(right - left + 1);left = i + 1;//right = hash[i];}}return result;}
};
这里是我的代码,虽然可以运行但是比较繁琐随便参考一下好了
class Solution {
public:static bool cmp(const vector<int>& a, const vector<int>& b) {// if(a[0] == b[0]);// 按起始位置升序排序return a[0] < b[0];}vector<int> partitionLabels(string s) {vector<vector<int>> index(26, vector<int>(2, -1));vector<int> result;// 遍历字符串s,统计其有什么字母以及字母的起始位置for (int i = 0; i < s.size(); ++i) {// 如果index中的第i个元素的起始位置为-1,说明还没有统计过这个字母的起始位置,将起始位置设为iif (index[s[i] - 'a'][0] == -1) {index[s[i] - 'a'][0] = i;}// 将该字符的终止位置更新为iindex[s[i] - 'a'][1] = i;}// 将index按起始位置排序sort(index.begin(), index.end(), cmp);int start = 0;int lower;int upper;if (index[0][0] != -1) {lower = index[0][0];upper = index[0][1];}/*for(int i = 1; i < index.size(); ++i){cout << index[i][0] << ' ' << index[i][1] << endl;}*/for (int i = 1; i < index.size(); ++i) {// 如果找到第一个不是-1的数组if (index[i][0] != -1 && index[i - 1][0] == -1) {lower = index[i][0];upper = index[i][1];}// 如果该数组存在且起始位跟上一个有交集,扩大upper取maxif (index[i][0] != -1 && index[i][0] < upper) {upper = max(upper, index[i][1]);}// 如果该数组起始位没有交集,存入切割点,更新lower和upperif (index[i][0] > upper) {result.push_back(upper - lower + 1);lower = index[i][0];upper = index[i][1];}if (i == index.size() - 1) {result.push_back(upper - lower + 1);}}return result;}
};