划分字母区间
给你一个字符串 s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s
。
返回一个表示每个字符串片段的长度的列表。
public List<Integer> partitionLabels(String s) {
char[] arr = s.toCharArray();
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
ArrayList<Integer> res = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
map.put(arr[i],i);
}
int start = 0;
int end = 0;
for (int i = 0; i < arr.length; i++) {
if(map.get(arr[i]) != i){
end = Math.max(end,map.get(arr[i]));
}else{
if(i == end){
res.add(end - start + 1);
start = end + 1;
end = map.get(arr[Math.min(start,arr.length-1)]);
}
}
}
return res;
}
贪心+哈希表记录最远距离,只要满足就截断
(不是复杂度最优解)