思路:
和题目45. 跳跃游戏 II-CSDN博客类似,不断更新最大的达到的范围,如果当前的i等于最大的范围,就说明当前是一个有效的分割,加入答案。
代码:
class Solution {
public List<Integer> partitionLabels(String s) {
int n = s.length();
int[] last = new int[26];
// 统计每一个字母最后出现的位置
for(int i = 0; i < n; i++) {
last[s.charAt(i) - 'a'] = i;
}
List<Integer> ans = new ArrayList<>();
int start = 0;
int range = 0;
for(int i = 0; i < n; i++) {
// 不断更新最远位置
range = Math.max(range, last[s.charAt(i) - 'a']);
// 到最远的位置了,要继续找了
if(i == range) {
ans.add(i - start + 1);
range = 0;
start = i + 1;
}
}
return ans;
}
}
参考: