[路飞]_leetcode-763-划分字母区间

简介: leetcode-763-划分字母区间

网络异常,图片无法展示
|


「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战


[题目地址][B站地址]


字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。


示例:


输入: S = "ababcbacadefegdehijhklij"
输出: [9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
复制代码


提示:


  • S的长度在[1, 500]之间。
  • S只包含小写字母 'a''z'


解题思路


本题要求划分片段的时候同一个字母,只能出现在一个片段中,所以针对单个字母,我们可以找到它第一次出现的位置,和最后一次出现的位置,这样的一个区间划分为一个片段,就保证了它只出现在一个片段中。


但是因为这样的区间中可能会有其他的字母,所以我们也要保证其他的字母只出现在一个片段中,那这个问题怎么解决呢?


这里我们可以遍历输入字符串,记录每一个字母第一次出现的下标和最后一次出现的下标,这样数组遍历完成,就得到了每个字母出现的开始位置和结束位置。


因为我们是从前向后遍历数组的,所以每个区间的开始位置是单调递增的。而这个时候,我们记录前面字母区间结束位置的最大值,当后续的区间的开始值大于前面区间结束值的最大值,就说明前面区间中的字母,在后续的区间中都不会再出现,这个时候,前面的区间就可以划分为一个单独的片段了。而这样一个片段的长度就是所有区间结束值的最大值减去开始值的最小值+1。每次找到一个片段后计算片段长度插入结果数组,当我们遍历完所有的字母区间,就得到了本题的结果。


代码实现


var partitionLabels = function (s) {
  // 创建map记录每个字母出现的开始结束下标
  let map = new Map()
  // 遍历输入字符串,获取每个字母出现的开始结束下标
  for (let i = 0; i < s.length; i++) {
    if (map.has(s[i])) map.get(s[i])[1] = i
    else map.set(s[i], [i, i])
  }
  // 初始化结果数组
  const res = []
  // 记录可合并区间的开始下标和结束下标
  let pre = 0,
    end = 0
  // 遍历 map 拆分区间
  map.forEach((item) => {
    // 获取当前字母出现的开始结束下标
    const [a, b] = item
    // 如果当前字母的开始下标在待合并区间范围内,则当前字母要被合并到区间中
    if (a <= end) end = Math.max(end, b)
    // 否则待合并区间可以合并为一个区间
    else {
      res.push(end - pre + 1)
      // 初始化接下来的待合并区间的开始结束下标
      pre = a
      end = b
    }
  })
  // 将最后的待合并区间插入结果数组
  res.push(end - pre + 1)
  // 返回结果数组
  return res
}
复制代码


至此我们就完成了 leetcode-763-划分字母区间


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章
|
4月前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
2月前
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
16 1
|
2月前
|
算法
Leetcode第57题(插入区间)
LeetCode第57题“插入区间”的解题方法,包括题目描述、示例、算法思路和代码实现,旨在解决将新区间插入有序且不重叠的区间列表中,并合并重叠区间的问题。
19 0
Leetcode第57题(插入区间)
|
2月前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
20 0
Leetcode第十七题(电话号码的字母组合)
|
2月前
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
16 0
【LeetCode 11】242.有效的字母异位词
|
2月前
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
32 0
|
4月前
|
算法
LeetCode第57题插入区间
LeetCode第57题"插入区间"的解题方法,利用原区间集有序的特性,通过三步插入操作,有效实现了新区间的插入和重叠区间的合并。
LeetCode第57题插入区间
|
4月前
|
算法
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
118 2