题目:
分析:题目要求最尽可能多的划分片段,自然想到贪心算法。并且题目要求每个字母只会出现在其中一个片段,那么贪心就可以这么做,从第一个字母开始,这个字母最后一次出现一定包含在这个片段当中,但头尾两个位置中间可能还有其它字母,那么这个片段也要把这些字母的最后一次出现包括进去。
用一个数组记录每个字母最后一次出现的位置,用两个变量分别记录这一个片段的开始和结束位置,并且结束位置是会随着遍历字符串更新的
代码:
class Solution {
public List<Integer> partitionLabels(String S) {
if(S == null || S.length() == 0){
return new ArrayList<>();
}
int[] lastIndex = new int[26];
for(int i = 0; i < S.length(); i++){
//记录s中每个字母最后出现的位置
lastIndex[S.charAt(i) - 'a'] = i;
}
int start = 0;
int end = 0;
List<Integer> result = new ArrayList<>();
for(int i = 0; i < S.length(); i++){
end = Math.max(end, lastIndex[S.charAt(i) - 'a']);
if(i == end){
result.add(i-start+1);
start = i+1;
}
}
return result;
}
}