思路:双指针
由于同一个字母只能出现在同一个片段,显然同一个字母的第一次出现的下标位置和最后一次出现的下标位置必须出现在同一个片段。
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了,此时前面出现过所有字母,最远也就到这个边界了。
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> ans = new ArrayList<>();
int[] last = new int[26];
int start = 0, end = 0;
int len = S.length();
// 得到每个字母最后一次出现的下标位置
for(int i = 0; i < len; i++){
last[S.charAt(i) - 'a'] = i;
}
for(int i = 0; i < len; i++){
end = Math.max(end, last[S.charAt(i) - 'a']);
// 当遍历到的字符序号等于end标志时,表示这是一个符合要求的且长度最短的字符串片段
if(i == end){
ans.add(end - start + 1);
// 新的一段
start = end + 1;
}
}
return ans;
}
}