面试题 16.16. Sub Sort LCCI

130 阅读1分钟

题目描述

leetcode-cn.com/problems/pa…

分析

划分一个区间的依据,是当前区间内的元素,不会在之后的 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
};