本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!

763.划分字母区间

题目链接: https://leetcode-cn.com/problems/partition-labels/

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

示例:
输入:S = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”, “defegde”, “hijhklij”。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的片段数较少。

提示:

  • S的长度在[1, 500]之间。
  • S只包含小写字母 ‘a’ 到 ‘z’ 。

思路

一想到分割字符串就想到了回溯,但本题其实不用回溯去暴力搜索。

题目要求同一字母最多出现在一个片段中,那么如何把同一个字母的都圈在同一个区间里呢?

如果没有接触过这种题目的话,还挺有难度的。

在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。

可以分为如下两步:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

如图:

明白原理之后,代码并不复杂,如下:

class Solution {
public:vector<int> partitionLabels(string S) {int hash[27] = {0}; // i为字符,hash[i]为字符出现的最后位置for (int i = 0; i < S.size(); i++) { // 统计每一个字符最后出现的位置hash[S[i] - 'a'] = i;}vector<int> result;int left = 0;int right = 0;for (int i = 0; i < S.size(); i++) {right = max(right, hash[S[i] - 'a']); // 找到字符出现的最远边界if (i == right) {result.push_back(right - left + 1);left = i + 1;}}return result;}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1) 使用的hash数组是固定大小

总结

这道题目leetcode标记为贪心算法,说实话,我没有感受到贪心,找不出局部最优推出全局最优的过程。就是用最远出现距离模拟了圈字符的行为。

但这道题目的思路是很巧妙的,所以有必要介绍给大家做一做,感受一下。

就酱,循序渐进寻算法,认准「代码随想录」,直接介绍给身边的朋友同学们!

我是程序员Carl,可以找我组队刷题,也可以在B站上找到我,本文leetcode刷题攻略已收录,更多精彩算法文章尽在公众号:代码随想录,关注后就会发现和「代码随想录」相见恨晚!

如果感觉对你有帮助,不要吝啬给一个

「leetcode」763.划分字母区间【贪心算法】详细图解相关推荐

  1. 力扣记录:贪心算法3较难(1)区间问题——55 跳跃游戏,45 跳跃游戏II,452 用最少数量的箭引爆气球,435 无重叠区间,763 划分字母区间,56 合并区间

    本次题目 55 跳跃游戏 45 跳跃游戏II 452 用最少数量的箭引爆气球 435 无重叠区间 763 划分字母区间 56 合并区间 55 跳跃游戏 局部最优:不管每次跳多少步,取最大跳跃步数,若覆 ...

  2. LeetCode 763. 划分字母区间

    文章目录 解法1:记录最大最小下标 解法2:贪心 https://leetcode-cn.com/problems/partition-labels/ 难度:中等   字符串 S 由小写字母组成.我们 ...

  3. 763. 划分字母区间009(贪心算法+思路+详解+图示)

    一:题目: 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中.返回一个表示每个字符串片段的长度的列表. 示例: 输入:S = "ababcba ...

  4. leetcode 763. Partition Labels | 763. 划分字母区间(双指针)

    题目 https://leetcode.com/problems/partition-labels/ 题解 将问题转化成线段分割问题:找到所有可以切的点,使得每一个线段都不会被切到 class Sol ...

  5. 763 划分字母区间

    题目描述 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一字母最多出现 在一个片段中.返回一个表示每个字符串片段的长度的列表. 题解 贪心策略 代码 class Solutio ...

  6. 763. 划分字母区间(JavaScript)

    var partitionLabels = function(s) {let arr=[] //保存结果let start=0let end=0let hash={}//遍历字符串,把下标保存for( ...

  7. 划分字母区间c语言,LeetCode(#763):划分字母区间

    一.前言 本题为LeetCode第763题,是一道 贪心算法 相关的算法题,难度中等. 本题链接:#763. 划分字母区间 二.题目 字符串S由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同 ...

  8. Leetcode题763、划分字母区间(Python题解)

    同类问题: 跳跃游戏 跳跃游戏II 视频拼接 问题: 题目来源:力扣(LeetCode) leetcode763.划分字母区间 难度:中等 分析: 贪心 这道题的思路和跳跃游戏II基本一致. 首先我们 ...

  9. c语言贪心算法合并箭,LeetCode刷题题库:贪心算法

    LeetCode刷题笔记:贪心算法 自大学开始,我便陆陆续续的学习一些 算法和数据结构 方面的内容,同时也开始在一些平台刷题,也会参加一些大大小小的算法竞赛.但是平时刷题缺少目的性.系统性,最终导致算 ...

  10. LeetCode力扣刷题——简单易懂的贪心算法

    贪心 一.算法解释 采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的. 贪心算法问题需要满足的条件: (1)最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较 ...

最新文章

  1. Python在window平台打包工具pyinstaller (三十五)
  2. geometry-api-java 学习笔记(七)拓扑运算之cut
  3. SAP CRM附件上传的一种增强实现
  4. hashCode到底有什么用?
  5. mysql 游标总条数_mysql 游标的使用总结
  6. ipsec ip替换_[windows]利用IPSec对指定的ip进行访问限制
  7. 阿里巴巴的程序员们来相亲啦!择偶标准大公开,瞬间吸引一众家长
  8. java中数组的返回值是什么类型_打印java 数组的最简单方式是什么?
  9. java 在类中定义接口_我们可以在Java接口中定义一个类吗?
  10. java1.4.2中文下载_j2sdk1.4.2|Java 2 SDK Standard Edition(Java开发平台)下载v1.4.2官方版 - 欧普软件下载...
  11. 计算机桌面锁定了没设密码怎么解锁,屏幕锁定怎么解锁?
  12. UIAccelerometer 加速计
  13. cocos2d - JS Sprite 镜像反转显示 ( Flipped )
  14. 扫地机器人半湿拖布_居然能自己洗拖布?云鲸智能扫拖一体机帮你真正解放双手...
  15. python输入第十个斐波那契数列,0,1,1,2,3,5,8,13,21,34
  16. Vue 定义全局方法
  17. 这40款优质APP大合集,总有一个适合你!
  18. SLAM无人车计算地图坐标,ros中计算地图坐标,rosweb计算画布对应的坐标(含代码,含公式,超详细),开发跨系统地图导航必备算法【可实现qt,android,c#,mfc,html等地图开发】
  19. C++ - 图形旋转
  20. C语言丨运算符号的三种用法(有示例代码)

热门文章

  1. 第一篇:CUDA 6.0 安装及配置( WIN7 64位 / 英伟达G卡 / VS2010 )
  2. 什么是商业智能BI和实施BI的解决方案【转】
  3. Qt5官方demo分析集10——Qt Quick Particles Examples - Emitters
  4. Java集合对象详解
  5. Local Database Overview for Windows Phone
  6. $CH0201$ 费解的开关
  7. linux解压缩6层
  8. mysql5.7 主从数据库操作命令
  9. JavaScript中document.getElementById和document.write
  10. 转载:【Oracle 集群】RAC知识图文详细教程(四)--缓存融合技术和主要后台进程