字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。力扣原文
示例:
输入: S = "ababcbacadefegdehijhklij"
输出: [9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
解题:
var partitionLabels = function (s) {
// 记录每个字母出现的开始下标和结束下标
const map = new Map();
//遍历字符串
for (let i = 0; i < s.length; i++) {
if (map.has(s[i])) {
// 更新下表
map.get(s[i])[1] = i;
} else {
// 获取开始下标
map.set(s[i], [i, i]);
}
}
const result = [];
// 记录开始区间、结束区间,称为待合并区间
let start = 0,
end = 0;
map.forEach((item) => {
// 获取当前字母的开始、结束下标
const [cStart, cEnd] = item;
// 对比当前字母的区间是否在待合并的区间内。
//当前字母的区间的开始下标如果小于或等于待合并的结束下标,则合并,否则合并区间
if (cStart <= end) {
end = Math.max(end, cEnd);
} else {
result.push(end - start + 1);
start = cStart;
end = cEnd;
}
});
//将最后的待合并区间的添加进结果
result.push(end - start + 1);
return result;
};