【代码随想录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;
    }
};
相关推荐
SunnyKriSmile2 小时前
C语言译码操作
c语言·算法·if语句·译码操作·switch语句
小小小CTFER2 小时前
理论题] 2025 年 “技耀泉城” 海右技能人才大赛网络安全知识竞赛题目(二)
算法·安全·web安全
断剑zou天涯4 小时前
【算法笔记】暴力递归尝试
java·笔记·算法
油泼辣子多加5 小时前
【实战】自然语言处理--长文本分类(1)DPCNN算法
算法·自然语言处理·分类
I'm a winner5 小时前
基于YOLO算法的医疗应用专题:第一章 计算机视觉与深度学习概述
算法·yolo·计算机视觉
vir026 小时前
P1928 外星密码(dfs)
java·数据结构·算法·深度优先·1024程序员节
喜欢吃燃面6 小时前
数据结构算法题:list
开发语言·c++·学习·算法·1024程序员节
寂静山林6 小时前
UVa 12991 Game Rooms
算法·1024程序员节
Java_小白呀7 小时前
第十四届蓝桥杯大赛软件赛国赛Java大学C组(部分)
职场和发展·蓝桥杯·1024程序员节