LeetCode 热题 100 之 763.划分字母区间

作者:逆境不可逃

你的支持是我的动力,谢谢!!!

解题思路:贪心算法

  1. 先遍历一次字符串,记录每个字符最后一次出现的下标。
  2. 再遍历字符串,维护当前片段的起始位置 start 和当前片段内所有字符的最远出现位置 end
  3. 当遍历到 end 时,说明当前片段结束,记录长度 end - start + 1,并更新 start 为下一个位置。

Java 代码实现

复制代码
class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] last = new int[26]; // 记录每个字母最后出现的位置
        int n = s.length();
        for (int i = 0; i < n; i++) {
            last[s.charAt(i) - 'a'] = i;
        }
        
        List<Integer> res = new ArrayList<>();
        int start = 0, end = 0;
        for (int i = 0; i < n; i++) {
            end = Math.max(end, last[s.charAt(i) - 'a']);
            if (i == end) { // 到达当前片段的终点
                res.add(end - start + 1);
                start = i + 1;
            }
        }
        return res;
    }
}

复杂度分析

  • 时间复杂度:O (n),两次线性遍历字符串。
  • 空间复杂度:O (1),仅使用大小为 26 的数组(小写字母数量),满足常量空间要求。

示例验证

  • 示例 1s = "ababcbacadefegdehijhklij"

    • 各字母最后位置:a=8, b=5, c=7, d=14, e=15, f=11, g=13, h=19, i=22, j=23, k=20, l=21
    • 遍历过程:
      • i=0 → end=8;i=8 时,片段长度 9(0-8)
      • i=9 → end=15;i=15 时,片段长度 7(9-15)
      • i=16 → end=23;i=23 时,片段长度 8(16-23)
    • 输出:[9,7,8]
  • 示例 2s = "eccbbbbdec"

    • 各字母最后位置:e=9, c=8, b=6, d=9
    • 遍历到 i=9 时才到达 end,片段长度 10
    • 输出:[10]
相关推荐
geats人山人海1 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz2 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni2 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu2 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7982 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭2 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶3 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展
图灵机z3 小时前
【算法提高课】AcWing 1027. 方格取数 长期攻克提高课-day3(3/219)
算法
hans汉斯3 小时前
计算机科学与应用|改进MeanShift算法在智能监控视频中的应用研究
图像处理·人工智能·功能测试·深度学习·算法·音视频