# 划分字母区间(763)
# 题目
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
# 示例
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
# 提示
S的长度在[1, 500]之间。 S只包含小写字母 'a' 到 'z' 。
# 算法
遍历数组,使用Map记录每个字母出现的最后一个位置
使用贪心
思想寻找最小片段:遍历数组,维护两个指针partitionStart
指向片段头部、partitionEnd
指向片段尾部,默认都为0;遍历的过程中,每次partitionEnd
指向当前字母最后出现的位置和当前partitionEnd
(即此轮遍历前的可能的片段尾部)的最大值,即值为当前片段可能的片段尾部,当i===partitionEnd
时,即当前i走过的所有字母(从partitionStart
开始)均在partitionStart
到partitionEnd
之间,此时可以将这个片段的长度放入结果数组,然后将partitionStart
设置为partitionEnd
的下一个位置
export const partitionLabels = (S) => {
let map = new Map();
const res = [];
for (let i = 0; i < S.length; i++) {
map.set(S[i], i);
}
for (let cur = 0, partitionStart = 0, partitionEnd = 0; cur < S.length; cur++) {
partitionEnd = Math.max(map.get(S[cur]), partitionEnd);
if (partitionEnd === cur) {
res.push(partitionEnd - partitionStart + 1);
partitionStart = partitionEnd + 1;
}
}
return res;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15