[路飞][LeetCode]763_划分字母区间

124 阅读1分钟

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

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

示例:

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

提示:

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

解题思路

  • 我们用哈希表记录每个字符最后出现的位置
  • s进行循环,每字母首次出现位到该字母最后出现位片段结束位在此最短
  • 片段中加入新字母 最后出现位 > 原字母的最后出现位 片段结束位延长到新字母最后出现位
  • 循环到片段结束位,将 结束位 - 开始位 放入结果集。开始位重置为当前位,即结束位

解题代码

var partitionLabels = function(s) {
    let arr = s.split('')
    const map = new Map(arr.map((v,i)=> [v,i]))
    const res = []
    let r = 0
    let l = -1
    arr.forEach((v,i)=>{
        if(map.get(v)>r){
            r = map.get(v)
        }
        if(r===i){
            res.push(r-l)
            l = r
        }
    })
    return res
};

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