字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:
- 输入:S = "ababcbacadefegdehijhklij"
- 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了
可以分为如下两步:
- 统计每一个字符最后出现的位置(用一个长度为26的数组作为26个字母的映射,值为下标,索引为字母)
- 从头遍历字符,并更新字符的最远出现下标max(如果当前字符的最后出现索引大于max,则更新max),如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
public static void main(String[] args) {
String S = "ababcbacadefegdehijhklij";
System.out.println(fenge(S));
}
//分割字母
public static List<Integer> fenge(String s){
//作为字母的映射
int [] arr = new int[26];
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
//index为字母,值为字母在字符串中的位置
arr[chars[i] - 'a'] = i;
}
//找到之前字符最大出现位置(value),与之相等的下标
int max = 0;
int last = -1;
List<Integer> list = new LinkedList<>();
for (int i = 0; i < chars.length; i++) {
/* max = Math.max(max,arr[chars[i] - 'a']);*/
if (arr[chars[i] - 'a'] > max){
max = arr[chars[i] - 'a'];
}
if (i == max){
list.add(i-last);
last = i;
}
}
return list;
}