前言
今天我们来学习另外一道贪心算法的题目——划分字母区间。话不多说,直接看题目。
题目描述
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:
输入:S = "ababcbacadefegdehijhklij" 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。 提示:
S 的长度在[1, 500]之间。 S 只包含小写字母 'a' 到 'z' 。
题意理解
- 我们是要分割字符串
- 我们要实现,同一字母只能出现在同一个字串中
思路
- 我们要使同一个字母只能包含在同一个子串中,是不是应该找到该字母最后出现的位置呢?————当然是这样的
- 什么时候,我们应该去做切割操作呢?————当我们走到当前遍历的字串中的所有字母的最远最后出现位置时。
画图描述思路
伪代码(描述思路)
Function main(arr){
Let result=[];
Let lastIndexArr={}
//记录字符串中字符出现现最后位置
for(let i=0;i<arr.length;i++){
lastIndexArr[arr[i]]=i
}
Let left=0,right= lastIndexArr[arr[0]];
// 切割字符串,获取子串长度
for(let i=0;i<arr.length;i++){
if(i<right){
right=Math.max(lastIndexArr[arr[i]],right);
}else{
result.push(right-left);
left=i+1;
right=lastIndexArr[arr[i+1]];
}
}
Return result;
}
总结
今天的算法题分享就到这里了,如有错误之处,欢迎大家留言指出,谢谢大家了。