【leetcode 763. 划分字母区间】贪心策略:局部最优大区间划分
链接地址:【leetcode 763. 划分字母区间】贪心策略:局部最优大区间划分
关于字符串英文字母的类型题,有一个很重要的技巧,在此题目中的编程中发挥重大作用
重要技巧:利用该英文字母的对应ASCII作为数组下标,来记录该字母的信息。
解题思路:
贪心策略:局部最优大区间划分,只不过这次是根据字母的最后一次出现的位置确定区间的最大值,因为字母是无规律分部,所以区间的最大值会跳跃性增加,不在是+1递增等规律递增
1,大区间起始和末尾
int max = 0; //字母比较后的最大下标,也是区间的最大值
int start = 0; //区间开始的下标
2,第一次循环,确定每个字母最后一次出现的位置。以此作为移动区间的可移动右边界值。
3,第二次循环
(1)如果此字母的下标大于区间的最大值,则最大区间无法包含,也会无法满足划分为尽可能多的片段的条件,所以进行划分,记录划分区间的长度,更新最大区间。
(2)如果此字母的下标不大于区间的最大值,判断当前字母最后一次出现的位置,更新区间的最大值,接着继续循环判断
4,补上最后一个区间的长度
代码:
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> res;
int array[26] = { 0 };
int n = s.size();
//获取每个字母的最大下标
for (int i = 0; i < n; i++)
{
if (array[s[i] - 'a'] <= i)
{
array[s[i] - 'a'] = i;
}
}
int max = 0; //字母比较后最大的下标
int start = 0; //区间开始的下标
for (int i = 0; i < n; i++)
{
//如果当前下标超过区间的最大值,表示无法包含,进行划分,先判断是否需要划分,否则会跳过
if (i > max)
{
res.push_back(i-start);
start = i; //更新区间的起始下标
max = array[s[i] - 'a'];
}
if (array[s[i] - 'a'] > max) //更新区间的最大值
max = array[s[i] - 'a'];
}
res.push_back(n - start); //补充最后一个区间的长度
return res;
}
};
如有不足之处,还望指正 [1]。
如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎