贪心算法:区间问题
只是记录自己的刷题过程,答案参考过多种题解。
如有错误感谢指正!
参考:
① LeetCode 101: A LeetCode Grinding Guide (C++ Version) 作者:高畅 Chang Gao
② 代码随想录 (programmercarl.com) 作者:程序员Carl
题目来源:
763.划分字母区间 (Medium)
一开始找字母的最大边界值这个思路方向对了,但实现 有问题:
Map<Character, Integer> end = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
end.put(s.charAt(i), i); //key是字母,value是最后一次出现在字符串中的下标
}
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。
可以分为如下两步:
-
统计每一个字符最后出现的位置。
-
从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了 分割点 。
public List<Integer> partitionLabels(String s) {
List<Integer> list = new LinkedList<>();
int[] edge = new int[26]; //新建26个字母的存储数组
char[] chars = s.toCharArray(); //把字符串转为字符数组
for (int i = 0; i < chars.length; i++) { //统计每一个字符最后出现的位置
edge[chars[i] - 'a'] = i; //不同位置对应的字母 = 该字母在已遍历过字符串中最远出现的位置下标
}
int index = 0;
int last = -1;
for (int i = 0; i < chars.length; i++) {
index = Math.max(index, edge[chars[i] - 'a']); //找到已遍历过的字符串中,出现过的字母的最远边界
if (i == index) { //字母在原字符串中的当前下标 == 该字母在已遍历过字符串中最远出现的位置下标,则找到了分割点
list.add(i - last); //填入字串长度
last = i; //更新字串开始下标
}
}
return list;
}