划分字母区间【763】
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
提示:
- S的长度在[1, 500]之间。
- S只包含小写字母 'a' 到 'z' 。
思路
思路解析:当前取的片段不难看出都是某个字段的最后一个值,所以我们先把最后一个值得下标保存起来,因为每个字母要求最多出现在一个片段中,这里我们设置开始begin=0,
从第一个开始,截止字段为last,设置最后的断点值,当last==j时,j前的所有字符都在该片段中j就是断点,剩下的就是判断字段长度了,last - begin + 1,j + 1代表从
当前位置的下一个开始,继续比对
代码
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> count = new ArrayList();
char[] chars = S.toCharArray();
Map<Character, Integer> map = new HashMap();
int leng = chars.length;
for(int i =0; i < leng; i++){
map.put(chars[i], i);
}
int last = -1;
int begin = 0;
for(int j = 0; j < leng; j++){
char c = chars[j];
if(map.get(c)>last){
last = map.get(c);
}
if(last == j){
count.add(last - begin + 1);
begin = j + 1;
}
}
return count;
}
}