【路飞】算法与数据结构-划分字母区间

85 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

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

示例 1:

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

提示:

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

思路

  • 用map存出现字符的最后位置
  • tempStart 和 tempEnd 为每段的起始位置
  • 更新tempEnd的值
  • 如果i与tempEnd相等,这就为一个片段
/**
 * @param {string} S
 * @return {number[]}
 */
var partitionLabels = function (S) {
    const map = new Map()
    for (let i = 0; i < S.length; i++) {
        map.set(S[i], i)
    }
    const res = []
    let tempStart = 0, tempEnd = 0
    for (let i = 0; i < S.length; i++) {
        tempEnd = Math.max(tempEnd, map.get(S[i]))
        if (i == tempEnd) {
            res.push(tempEnd - tempStart + 1)
            tempStart = i + 1
        }
    }
    return res
};