分两步:
- 统计每个元素的出现的最远下标
- 更新遍历过元素的最远下标,如果遍历到遍历过的元素的最远下标时,收获结果
class Solution {
public List<Integer> partitionLabels(String s) {
// 存放结果
List<Integer> res = new LinkedList<>();
char[] arr = s.toCharArray();
int[] edge = new int[26];
// 先统计每个字符出现的最远下标
for(int i=0; i<arr.length; i++){
edge[arr[i]-'a'] = i;
}
int last = -1;
// 记录当前遍历过的元素中的最远下标
int idx = 0;
for(int i=0; i<arr.length; i++){
// 更新遍历元素的最远下标
idx = Math.max(idx,edge[arr[i]-'a']);
// 如果当前遍历到遍历过元素的最远下标时,收获结果,因为同一个字母只能在同一个片段中
if(i == idx){
res.add(i - last);
last = i;
}
}
return res;
}
}
运行结果: