【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]


  1. 如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎

posted @ 2021-05-19 12:36  CoutCodes  阅读(62)  评论(0编辑  收藏  举报