【代码随想录day 30】 力扣 763. 划分字母区间

视频讲解:https://www.bilibili.com/video/BV18G4y1K7d5/?vd_source=a935eaede74a204ec74fd041b917810c

文档讲解:https://programmercarl.com/0763.划分字母区间.html#思路

力扣题目:https://leetcode.cn/problems/partition-labels/

这道题我也做出来了,但是思想很麻烦:

  1. 统计多少字母并且其起始位置
  2. 按起始顺序升序排列
  3. 找到第一个存在的数组开始遍历,如果和前一个有交集,upper取max。
  4. 如果没有交集,upper即为截断点,lower和upper更新。

但是卡哥的思想就很简洁,不用考虑起始位置,只需要考虑右边界的最大值即可,

  1. 每次遍历取最大值的右边界

  2. 如果i 遍历到了右边界就说明该截断了,这里很精妙***

  3. 存入截断值,更新left,right在每次更新数的时候会更新,所以不用更新

cpp 复制代码
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;
    }
};

这里是我的代码,虽然可以运行但是比较繁琐随便参考一下好了

cpp 复制代码
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,说明还没有统计过这个字母的起始位置,将起始位置设为i
            if (index[s[i] - 'a'][0] == -1) {
                index[s[i] - 'a'][0] = i;
            }
            // 将该字符的终止位置更新为i
            index[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取max
            if (index[i][0] != -1 && index[i][0] < upper) {
                upper = max(upper, index[i][1]);
            }
            // 如果该数组起始位没有交集,存入切割点,更新lower和upper
            if (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;
    }
};
相关推荐
hansang_IR4 分钟前
【题解】洛谷 P2476 [SCOI2008] 着色方案 [记搜]
c++·算法·记忆化搜索
趙卋傑7 分钟前
常见排序算法
java·算法·排序算法
阿巴~阿巴~42 分钟前
IPv4地址转换函数详解及C++容器安全删除操作指南
linux·服务器·c++·网络协议·算法·c++容器安全删除操作·ipv4地址转换函数
TT哇42 分钟前
【面经 每日一题】面试题16.25.LRU缓存(medium)
java·算法·缓存·面试
SKYDROID云卓小助手1 小时前
无人设备遥控器之差分信号抗干扰技术
网络·stm32·单片机·嵌入式硬件·算法
美狐美颜SDK开放平台1 小时前
什么是美颜sdk?美型功能开发与用户体验优化实战
人工智能·算法·ux·直播美颜sdk·第三方美颜sdk·视频美颜sdk
@宁兰2 小时前
算法实现总结 - C/C++
c语言·c++·算法
测试19982 小时前
如何用Appium实现移动端UI自动化测试?
自动化测试·软件测试·python·测试工具·ui·职场和发展·appium
Doro再努力2 小时前
2025_11_14洛谷【入门1】数据结构刷题小结
前端·数据结构·算法
蒙奇D索大2 小时前
【算法】回溯算法精讲:从深度优先搜索到剪枝优化
经验分享·笔记·算法·深度优先·剪枝·改行学it