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

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

题目描述

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

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

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

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

示例 2:

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

提示:

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

代码及注释

func partitionLabels(s string) []int {// 创建一个数组来存储每个字符最后出现的位置lastPos := make([]int, 26)// 结果数组,用于存储每个分区的长度res := make([]int, 0)// 遍历字符串,记录每个字符最后出现的位置for i, c := range s {lastPos[c - 'a'] = i}// 初始化分区的开始和结束位置start, end := 0, 0// 再次遍历字符串来确定分区for i, c := range s {// 更新当前分区的结束位置为当前字符的最后出现位置end = max(end, lastPos[c - 'a'])// 如果当前位置i等于当前分区的结束位置,说明找到了一个分区if i == end {// 计算当前分区的长度并添加到结果数组中res = append(res, end - start + 1)// 更新下一个分区的开始位置start = end + 1}}// 返回结果数组return res
}// 返回两个数的最大值
func max(a, b int) int {if a > b {return a}return b
}

代码解释

  1. 记录每个字符的最后出现位置

    for i, c := range s {lastPos[c - 'a'] = i
    }
    

    这里我们遍历字符串s并记录每个字符最后出现的位置。这样,当我们遍历字符串以确定子串边界时,我们可以直接查找每个字符的最后出现位置。

  2. 确定子串的边界

    for i, c := range s {end = max(end, lastPos[c - 'a'])if i == end {res = append(res, end - start + 1)start = end + 1}
    }
    

    在这个循环中,我们遍历字符串s。对于每个字符,我们更新当前子串的结束位置end为当前字符的最后出现位置。当i == end时,意味着我们找到了一个子串,其边界是startend。我们计算这个子串的长度并将其添加到结果数组res中,然后更新startend + 1以寻找下一个子串。

  3. 返回结果数组

    return res
    

    最后,我们返回结果数组res,其中包含了所有子串的长度。

通过这种方法,我们可以有效地找到字符串s中所有满足条件的子串,其中每个字母只出现在一个子串中。

http://www.lryc.cn/news/333005.html

相关文章:

  • IDEA2023创建SpringMVC项目
  • ubuntu-server部署hive-part2-安装hadoop
  • Python深度学习032:conda操作虚拟环境env的全部命令
  • 使用Java拓展本地开源大模型的网络搜索问答能力
  • Mybatis——一对多关联映射
  • Pytorch实用教程:TensorDataset和DataLoader的介绍及用法示例
  • uni-app如何实现高性能
  • docker 应用部署
  • java.awt.FontFormatException: java.nio.BufferUnderflowException
  • C++ 枚举类型 ← 关键字 enum
  • MySQL故障排查与优化
  • 如何做一个知识博主? 善用互联网检索
  • 《QT实用小工具·十》本地存储空间大小控件
  • 作为一个初学者该如何学习kali linux?
  • 多线程学习-线程池
  • Linux第4课 Linux的基本操作
  • 堆排序解读
  • docker + miniconda + python 环境安装与迁移(详细版)
  • 蓝桥杯刷题第八天(dp专题)
  • 【WEEK6】 【DAY1】DQL查询数据-第一部分【中文版】
  • Linux:权限篇
  • Lua热更新(xlua)
  • 并查集(基础+带权以及可撤销并查集后期更新)
  • 基于 Java 的数据结构和算法 (不定期更新)
  • 考研回忆录【二本->211】
  • 【XCPC笔记】2023 (ICPC) Jiangxi Provincial Contest——ABCIJKL 做题记录
  • 猫头虎分享已解决Bug || **URLError (URL错误)** 全方位解析
  • 如何使用极狐GitLab 启用自动备份功能
  • HTML/XML转义字符对照
  • 设计模式:组合模式示例