当前位置: 首页 > article >正文

力扣 划分字母区间

贪心算法,存状态,合并区间。

题目

同一字母最多出现在一个片段中,因此要找到相同字母的上界跟下界。由于是对字符串进行划分,在一个片段内,从前往后遍历,找到每个字母的最后一个下标即是可能的划分点了,同时这也是这道题贪心中所要维护的状态值。找到所有字母的最大下标后,就可以对字符串的字符再次进行比较,每次更新状态值,如果索引比状态值小,说明当前遍历过的字符还没有找完,当找到时,即可以进行划分了。划分后的区间计数后加入数组,接着移动指针到下一个数开始下一个区间的划分。

时间复杂度: O(n),空间复杂度: O(∣Σ∣),其中 Σ 是字符串中的字符集。 

class Solution {
    public List<Integer> partitionLabels(String S) {
        char[] s = S.toCharArray();
        int n = s.length;
        int[] last = new int[26];
        for (int i = 0; i < n; i++) {
            last[s[i] - 'a'] = i; // 每个字母最后出现的下标
        }

        List<Integer> ans = new ArrayList<>();
        int start = 0, end = 0;
        for (int i = 0; i < n; i++) {
            end = Math.max(end, last[s[i] - 'a']); 
            if (end == i) { 
                ans.add(end - start + 1); 
                start = i + 1; 
            }
        }
        return ans;
    }
}


http://www.kler.cn/a/567733.html

相关文章:

  • mongodb副本集1主2从节点的配置方法示例
  • 【AI】DeepSeek本地部署,Ollama + vscode + Continue,实现本地运行LLM大模型,以及代码自动补全
  • MySQL索引深度剖析:从数据结构到实际应用
  • Spring Boot 流式响应豆包大模型对话能力
  • windows服务器更新jar包脚本
  • 为什么gpt-sovits微调训练轮数最大只能设置为3
  • 进程控制(创建、终止、等待、替换)
  • 【vscode-解决方案】vscode 无法登录远程服务器的两种解决办法
  • 矩阵基本概念
  • 合并两个有序链表:递归与迭代的实现分析
  • 【NLP 30、大模型中的 ”Token“】
  • deepseek+mermaid【自动生成流程图】
  • 汽车免拆诊断案例 | 保时捷车发动机偶发熄火故障 2 例
  • Java中的大数据流处理框架与技术比较
  • 汽车离合器片检具设计
  • java中代理模式 之 jdk动态代理模式
  • 2. 在后端代码中加入日志记录模块
  • 接口测试工具:postman详解
  • 释放你的IDE潜能:Code::Blocks 插件创意开发深度指南
  • 新装的conda 以及pycharm未能正确初始化,或conda环境变量配置错误问题解决!!!