class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer>list=new ArrayList<>();
int[][] arr=new int[26][2];
for(int i=0;i<arr.length;i++){
arr[i][0]=-1;
arr[i][1]=-1;
}
for(int i=0;i<S.length();i++){
int num=S.charAt(i)-'a';
if(arr[num][0]==-1){
arr[num][0]=i;
}else{
arr[num][1]=i;
}
}
for(int i=0;i<26;i++) {
if(arr[i][1]==-1){
arr[i][1]=arr[i][0];
}
}
boolean flag=true;
int num=0,count=0,start=0,end=0;
for(int i=0;i<S.length();i++){
if(flag){
num = S.charAt(i) - 'a';
count = 1;
start = arr[num][0];
end = arr[num][1];
flag=false;
}else{
int k=S.charAt(i)-'a';
if(arr[k][0]<=end && arr[k][1]>=end){
end=arr[k][1];
count++;
}else if(arr[k][0]<=end && arr[k][1]<=end) {
count++;
}else{
list.add(count);
flag=true;
i--;
}
}
if(i==S.length()-1 && flag==false){
list.add(count);
}
}
return list;
}
}
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> res = new ArrayList<>();//返回的结果
int[] map = new int[26];
for(int i = 0; i < S.length(); i++) {//记录每个字母在S中最后一次出现的位置
map[S.charAt(i) - 'a'] = i;
}
int start = -1, end = 0;//start是下一个字段的首字母的前一个位置,第一个字段的首字母的位置一定是0
for(int i = 0; i < S.length(); i++) {
end = Math.max(end, map[S.charAt(i) - 'a']);//不断更新末尾指针的位置
if(end == i) {//当i指针的位置和末尾指针的位置相同时意味着[start,end]之间的字母的最后出现位置都在[start,end],尾指针无法再更新
res.add(end - start);//当前字段的长度
start = end;//start是下一个字段的首字母的前一个位置
}
}
return res;
}
}