763.划分字母区间

划分字母区间

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

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

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

示例 1:

输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:划分结果为 “ababcbaca”、”defegde”、”hijhklij”。每个字母最多出现在一个片段中。

示例 2:

输入:s = “eccbbbbdec”
输出:[10]

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母组成

解析

贪心算法。先记录每个字符最后出现的位置,然后遍历字符串,维护当前片段的最远边界。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var partitionLabels = function (s) {
const last = {};
for (let i = 0; i < s.length; i++) {
last[s[i]] = i;
}
const result = [];
let start = 0, end = 0;
for (let i = 0; i < s.length; i++) {
end = Math.max(end, last[s[i]]);
if (i === end) {
result.push(end - start + 1);
start = end + 1;
}
}
return result;
};

时间复杂度 O(n),空间复杂度 O(1)(字符集大小固定为 26)。


763.划分字母区间
https://leetcode.lz5z.com/763.partition-labels/
作者
tickli
发布于
2024年11月24日
许可协议