763、划分字母区间
基本思想:
贪心
具体实现:
1.统计每一个字符最后出现的位置
2.用i从头遍历字符,idx记录这些字符更靠后的最后出现的位置
比如图中a最后出现的位置是8,b最后出现的位置是5,idx记录8
分割点就是i == idx时,i的值
代码:
class Solution { public List<Integer> partitionLabels(String s) { List<Integer> list = new LinkedList<>(); int[] edge = new int[123]; char[] chars = s.toCharArray(); for (int i = 0; i < chars.length; i++){ edge[chars[i] - 0] = i; //edge里面存放的是所有字符在chars这个数组中最后出现的位置 //edge的下标对应字符的ascii //比如[abca]这个数组对应的edge就是 //[.....301.....] 3在第97位,a的ascii是97,a在数组中最后的位置下标是3 } int idx = 0; int last = -1; for (int i = 0; i < chars.length; i++){ idx = Math.max(idx, edge[chars[i] - 0]); if (i == idx) { list.add(i - last); last = i; } } return list; } }