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

【Leetcode hot 100】763.划分字母区间

问题链接

763.划分字母区间

问题描述

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 "ababcc" 能够被分为 ["abab", "cc"],但类似 ["aba", "bcc"]["ab", "ab", "cc"] 的划分是非法的。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s

返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”、“defegde”、“hijhklij” 。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。

示例 2:

输入:s = “eccbbbbdec”
输出:[10]

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母组成

问题解答

解题思路

利用贪心算法结合哈希表(或数组) 记录字符最后出现位置,通过双指针确定每个片段的边界,具体步骤如下:

  1. 记录字符最后位置:首先遍历字符串,用数组(因字符仅为小写字母,数组效率高于哈希表)存储每个字符在字符串中最后一次出现的下标。
  2. 双指针划分子段
    • start:当前片段的起始下标,初始为 0。
    • end:当前片段的最远边界,初始为 0。
    • 再次遍历字符串,对于每个字符,更新 end 为当前字符最后位置与当前 end 的最大值(确保当前片段包含该字符的所有出现)。
    • 当遍历到的下标 i 等于 end 时,说明当前片段已包含所有必要字符,计算片段长度(end - start + 1)并加入结果列表,同时更新 startend + 1,开启下一个片段。

代码实现

import java.util.ArrayList;
import java.util.List;class Solution {public List<Integer> partitionLabels(String s) {// 存储每个小写字母最后出现的下标(a-z对应索引0-25)int[] lastOccur = new int[26];int n = s.length();// 第一步:遍历字符串,记录每个字符的最后出现位置for (int i = 0; i < n; i++) {char c = s.charAt(i);lastOccur[c - 'a'] = i; // 字符c对应的索引为c-'a',更新其最后位置为i}List<Integer> result = new ArrayList<>();int start = 0; // 当前片段的起始下标int end = 0;   // 当前片段的最远边界// 第二步:遍历字符串,确定每个片段的边界for (int i = 0; i < n; i++) {char c = s.charAt(i);// 更新当前片段的最远边界(必须包含当前字符的所有出现)end = Math.max(end, lastOccur[c - 'a']);// 当i达到end时,当前片段已完整(所有字符的所有出现都在[start, end]内)if (i == end) {result.add(end - start + 1); // 加入当前片段长度start = end + 1; // 更新下一个片段的起始位置}}return result;}
}

代码解释

  1. 字符最后位置存储

    • 利用大小为 26 的数组 lastOccur 存储每个小写字母的最后出现下标,因为小写字母仅有 26 种,数组访问效率为 O(1),优于 HashMap。
    • 遍历字符串时,对于每个字符 c,通过 c - 'a' 计算其在数组中的索引,并用当前下标 i 更新该位置的值(确保最终存储的是“最后一次出现”的下标)。
  2. 双指针边界确定

    • start 始终指向当前未划分片段的起始位置,初始为 0。
    • end 是当前片段的“动态最远边界”:每遇到一个字符,都要确认该字符的最后出现位置是否超出当前 end,若超出则更新 end(保证当前片段包含该字符的所有出现)。
    • i == end 时,说明从 startend 的所有字符,其最后出现位置都不超过 end,即该片段是“最小且完整”的,可加入结果列表,并开启下一个片段。

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串长度。仅需遍历字符串两次(第一次记录最后位置,第二次划分子段),每次遍历均为线性时间。
  • 空间复杂度:O(1),仅使用大小为 26 的固定数组(与字符串长度无关)和结果列表(结果列表存储的是片段长度,属于输出空间,不计入算法额外空间)。
http://www.dtcms.com/a/499580.html

相关文章:

  • Agent向量存储中的记忆衰退与记忆过载解决方案
  • php网站跟随导航扁平化配色方案网站
  • 降噪算法的效果分析
  • FreeSWITCH RTP 自动调整花费时间太久
  • 怎么在一个网站做编辑一流的镇江网站优化
  • 常用电子元器件学习总结
  • TCP/IP协议相关知识点
  • 网站点播视频如何做帮助做APP的网站公司
  • 直圆锥(Right Circular Cone)
  • vue适合做门户网站吗企业官网下载
  • 熬夜肌救星:EGT+AKG+SOD科学修护
  • 上海住房城乡建设网站成都创软科技的口碑
  • 建设银行网站建设情况网络维护公司需要什么资质
  • 解决stm32cubeide工程复制后更改路径导致无法识别问题
  • GitHub 热榜项目 - 日榜(2025-10-18)
  • 【问题】Mac 的 Finder 中没有桌面选项如何处理?(访达 -> 设置 -> 边栏 -> 勾选桌面)
  • string类介绍
  • 深度学习物理神经网络(PINN)!
  • 青岛做公司网站的公司ppt模板下载简约
  • 网站为什么做静态广州专业网站建设后台管理便捷
  • Unity游戏基础-7(简单的水面Shader Graph,案例1)
  • 在 Mac/linux 的 VSCode 中使用Remote-SSH远程连接 Windows
  • 国内AI编程工具
  • 宝塔面板安装ecshop
  • 大型网站一般用什么语言做的建设行业信息管理系统网站
  • 西安建站软件在wordpress官网建站
  • OceanBase数据库集群升级手册
  • 深入理解与手写发布订阅模式
  • 关于企业网站建设的必要性关键洞察力
  • ubuntu系统安装记录