先从第一个字符开始,找到最后一次该字符出现的位置,然后判断包含在这个范围之内的字符是否满足最后一次出现的位置<=lastIndex,不满足要进行重新更新lastindex;直到所有的字符都在lastindex范围之内
class Solution {
public List<Integer> partitionLabels(String S) {
/*按照字符最后一次出现的位置进行划分,如果下一个字符最后一次出现的位置
//在当前lastindex的里面,就不划分片段,如果不在,就从lastindex开始划分*/
//1.先定义26个字符出现的最后一次索引位置
int[] lastmap=new int[26];
//2.把最后一次出现的位置都存储进去
for(int i=0;i<S.length();i++){
lastmap[S.charAt(i)-'a']=i;
}
List<Integer> res=new ArrayList<>();
//3.开始查找满足条件的选择
int firstIndex=0;
while(firstIndex<S.length()){
int lastIndex=firstIndex;
//ababcabcc||a最后一次出现的位置5,但是c最后一次出现的位置大于5,
//因此要更新lastIndex为c最后一次出现的位置;然后让lastindex里面的字符最后一次出现的位置都<=lastIndex;
//作为一次切分
for(int i=firstIndex;i<S.length()&&i<=lastIndex;i++){
//4.求出每个字符最后一次出现的位置
int index=lastmap[S.charAt(i)-'a'];
//5.判断--找出每个字符最后一次出现的位置
if(index>lastIndex){
lastIndex=index;
}
}
//满足上述条件之后,重新开始划片
res.add(lastIndex-firstIndex+1);
firstIndex=lastIndex+1;
}
return res;
}
}