划分字母区间

Meteor 2023-10-09 10:27:34
Categories: Tags:

763. 划分字母区间

解题思路

将相同字母划分到同一片段,且字符串的顺序不能改变。

利用贪心思想,每次都找某个字符的最右边的位置,即如果找字符’a’所在的片段,先要确定它的结束位置,然后在’a’的开始位置到结束位置中间寻找是否有其它字符的结束位置超出了’a’的范围,如果超出了,那么就以新的字符继续开始扫描直到它的结束位置,如果没有超出,那么’a’的开始位置到结束位置就是一个片段。

代码

class Solution {
public List<Integer> partitionLabels(String s) {
// 记录每个字符的结束位置
int[] res = new int[26];
for(int i = 0; i < s.length(); i++){
res[s.charAt(i)-'a'] = i;
}
// 记录开始位置和结束位置
int left = 0;
int right = 0;
List<Integer> ans = new ArrayList<>();
for(int i = 0; i < s.length(); i++){
//更新结束位置
right = Math.max(right, res[s.charAt(i)-'a']);
//若结束位置等于当前位置,则添加片段并将开始位置移动到下一位
if(right==i){
ans.add(right-left+1);
left = i+1;
}
}
return ans;
}
}

总结

贪心算法没有固定的解法,很多时候只能靠经验判断是否能用贪心