1.题目描述:
字符串s由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
2.贪心算法:
找出26个字母最后出现的位置,从前往后遍历,取到出现字母中最后出现位置的最大值,若最大值一旦和当前索引一致(保证了后面不会有重复元素并得到最小划分),说明需要划分。
class Solution {
public List<Integer> partitionLabels(String s) {
int[] last = new int[26];
for (int i = 0; i < s.length(); i++) {
last[s.charAt(i) - 'a'] = i;
}
int max = 0;
int pre = -1;
List<Integer> list = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
max = Math.max(max, last[s.charAt(i) - 'a']);
if (max == i) {
list.add(i - pre);
pre = i;
}
}
return list;
}
}
第一个for循环优化一下:
class Solution {
public List<Integer> partitionLabels(String s) {
int[] last = new int[26];
for (int i = s.length() - 1; i >= 0; i--) {
if (last[s.charAt(i) - 'a'] == 0) last[s.charAt(i) - 'a'] = i;
}
int max = 0;
int pre = -1;
List<Integer> list = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
max = Math.max(max, last[s.charAt(i) - 'a']);
if (max == i) {
list.add(i - pre);
pre = i;
}
}
return list;
}
}