Skip to content
On this page

划分字母区间

Question

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是s

返回一个表示每个字符串片段的长度的列表。

image-20230620175044921

思路

可以分为如下两步:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
js
var partitionLabels = function(s) {
    let hash = new Array(27,0)       // i为字符,hash[i]为字符出现的最后位置
    for(let i=0;i<s.length;i++){     //统计每一个字符最后出现的位置
        hash[s[i]] = i
    }
    let res = []
    let farest = 0
    let last = 0
    for(let i=0;i<s.length;i++){
        farest = hash[s[i]]>farest?hash[s[i]]:farest
        if( hash[s[i]] === farest && hash[s[i]] === i ) {
            res.push(i-last+1)
            last = i+1
        }
    }
    return res
};