3ms beats 100% in java 设立一个lastIndex数组存放每个字母最后一次出现的位置,然后从前向后找,如果一个区间里面某个字符的最后一个位置比这个区间的终点还要靠后,那么区间的终点=这个字符的最后一次出现的位置,时间O(N),贪心算法
class Solution {
public List<Integer> partitionLabels(String S) {
int lastindex[]=new int[26],start=0,len=S.length(),end,i;
char ch[]=S.toCharArray();
lastIndex(ch,lastindex);
List<Integer> ans=new LinkedList<Integer>();
while(start<len) {
char startchar=ch[start];
end=lastindex[startchar-'a'];
i=start;
while(i<=end) {
if(lastindex[ch[i]-'a']>end)
end=lastindex[ch[i]-'a'];
i++;
}
ans.add(end-start+1);
start=end+1;
}
return ans;
}
void lastIndex(char ch[],int index[]) {
int i,len=ch.length;
for(i=0;i<26;i++)
index[i]=-1;
for(i=len-1;i>=0;i--) {
int patition=ch[i]-'a';
if(index[patition]==-1)
index[patition]=i;
}
}
}