/** * 题目需要找到合适的分组片段,那么就要统计每个字母出现的最远下标是多少 * 在遍历字符串的过程中不断更新最远下标,一旦遍历到最远下标,做字符串的切割 * 字符串的切割分组 */ public List<Integer> partitionLabels(String s) { int[] used = new int[26];//由于小写字母,所以一共只有26长度,其实也可以用map,只是数组效率要高一点 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); used[c - 'a'] = i; } List<Integer> rt = new ArrayList<>(); int max = 0;//这里必须为0,因为下标起始从0开始,假如第一个元素的最大位置就是0 int count = 0; for (int i = 0; i < s.length(); i++) { count++; char c = s.charAt(i); int index = used[c - 'a']; max = Math.max(index, max);//优先更新目前区间最大 if (i == max) {//如果遍历到目前的下标,那么结果集需要收集一下 rt.add(count); max = 0;//需要重置一下 count = 0; } } return rt; }