【leetcode 763. 划分字母区间】贪心策略:局部最优大区间划分

  • Post author:
  • Post category:其他



关于字符串英文字母的类型题,有一个很重要的技巧,在此题目中的编程中发挥重大作用



重要技巧:利用该英文字母的对应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. 如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力

    ↩︎



版权声明:本文为CoutCodes原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。