看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
字符串 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
};
如有任何问题或建议,欢迎留言讨论!