今天依旧做了贪心算法的专题练习,本道题的描述为:字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:S = “ababcbacadefegdehijhklij”
则返回[9,7,8]
本道题目我的思路为:既然相同字母不能出现在不同的片段中,则需要记录字母的最后出现位置,并形成一个区间,在此区间中的每一个字母的最后出现位置若大于第一个字母的最后出现位置,则区间延长,直到没有这种情况出现则一个区间结束。
如:abcabcddeafbgghi
第一个a的最后出现位置在f之前,则遍历该区间,发现b的最后出现位置又在a后,则更新last值并继续进行。
以下是我的代码,它还有待优化的地方,二刷时可以注意。如:用26位长的数组而不是和字符串长度等长的数组记录字母的最后出现位置。
class Solution {
public List<Integer> partitionLabels(String S) {
int length = S.length();
List<Integer> result = new ArrayList<>();
int loc[] = new int[length];
for(int i=0;i<length;i++){
loc[i] = i;
for(int j=i+1;j<length;j++){
if(S.charAt(j)==S.charAt(i)){
loc[i] = j;
}
}
}
for(int i=0;i<length;i++){
int last = loc[i];
for(int j=i+1;j<last;j++){
if(loc[j]>last){
last = loc[j];
}
}
result.add(last-i+1);
i=last;
}
return result;
}
}