作者:逆境不可逃
你的支持是我的动力,谢谢!!!

解题思路:贪心算法
- 先遍历一次字符串,记录每个字符最后一次出现的下标。
- 再遍历字符串,维护当前片段的起始位置
start和当前片段内所有字符的最远出现位置end。- 当遍历到
end时,说明当前片段结束,记录长度end - start + 1,并更新start为下一个位置。
Java 代码实现
class Solution {
public List<Integer> partitionLabels(String s) {
int[] last = new int[26]; // 记录每个字母最后出现的位置
int n = s.length();
for (int i = 0; i < n; i++) {
last[s.charAt(i) - 'a'] = i;
}
List<Integer> res = new ArrayList<>();
int start = 0, end = 0;
for (int i = 0; i < n; i++) {
end = Math.max(end, last[s.charAt(i) - 'a']);
if (i == end) { // 到达当前片段的终点
res.add(end - start + 1);
start = i + 1;
}
}
return res;
}
}

复杂度分析
- 时间复杂度:O (n),两次线性遍历字符串。
- 空间复杂度:O (1),仅使用大小为 26 的数组(小写字母数量),满足常量空间要求。
示例验证
示例 1 :
s = "ababcbacadefegdehijhklij"
- 各字母最后位置:a=8, b=5, c=7, d=14, e=15, f=11, g=13, h=19, i=22, j=23, k=20, l=21
- 遍历过程:
- i=0 → end=8;i=8 时,片段长度 9(0-8)
- i=9 → end=15;i=15 时,片段长度 7(9-15)
- i=16 → end=23;i=23 时,片段长度 8(16-23)
- 输出:
[9,7,8]示例 2 :
s = "eccbbbbdec"
- 各字母最后位置:e=9, c=8, b=6, d=9
- 遍历到 i=9 时才到达 end,片段长度 10
- 输出:
[10]
