题目描述
分析
划分一个区间的依据,是当前区间内的元素,不会在之后的 index 出现
因此划分的时机,是正好遍历到一个 index 的时候,左边所有元素都可以和右边一刀两断,即不再出现,我们就在这里划一刀
算法
哈希
过程
统计每个字母最后位置 -> 遍历划分 -> 返回结果
统计位置
遍历,使用 map 统计每个字母最后出现的 index
划分
再次遍历,记录更新一个最远距离,他是我遍历过的所有字母最远出现的 index
当遍历到这个最远 index 时候,做一次划分
返回
构建数组,记录所有划分的 index
代码
/**
* @param {string} s
* @return {number[]}
*/
var partitionLabels = function(s) {
const map = new Map(), n = s.length
for (let i = 0; i < n; i++) {
map.set(s[i], i)
}
let max = 0
let start = 0
const ret = []
for (let i = 0; i < n; i++) {
const c = s[i]
max = Math.max(max, map.get(c))
if (max === i) {
ret.push(i - start + 1)
start = i + 1
}
}
return ret
};