划分字母区间(双指针,贪心)

  • 双指针
  • 贪心

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

双指针

思路一:目的是找到最多的n个区间,这写区间中的字母在别的区间没有出现。那么从第一个字母开始,从后边找到与其相同的作为区间的终点。在这个区间里移动,找相对应字母的最后一个,如果比其大我们就更新区间的终点。

c 语言用数字代替就好
代码:

vector<int> partitionLabels(string s) {vector<int>ans;// left :双指针的左指针,用来查询区间中的字母// end :记录当前区间的末端//start:记录区间的开始位置int left,end,start;int n = s.size();left= 0;while(left<n) //不能超过字符串长度{start = left; //记录区间开始位置char ch = s[left]; //区间开始字母int j = n-1;while(j>left&&s[j]!=ch)j--; //从后边遍历找到的第一个与其相同的字母就是最后的end = j; //标记区间终点while(left<end) //在这个区间上更新,不能={left ++; //右移char ch = s[left];int j = n-1;while(j>left&&s[j]!=ch)j--; //查找end = max(end,j); //更新终点}ans.push_back(left+1-start); //压入区间中字符个数left ++;//寻找下一个区间}return ans;}

贪心

思路:
由于同一个字母只能出现在同一个片段,显然同一个字母的第一次出现的下标位置和最后一次出现的下标位置必须出现在同一个片段。因此需要遍历字符串,得到每个字母最后一次出现的下标位置。

在得到每个字母最后一次出现的下标位置之后,可以使用贪心的方法将字符串划分为尽可能多的片段,具体做法如下。

从左到右遍历字符串,遍历的同时维护当前片段的开始下标start 和结束下标 end,初始时 start=end=0。

对于每个访问到的字母 c,得到当前字母的最后一次出现的下标位置 end
则当前片段的结束下标一定不会小于 end 因此令 end=max(end,end )。

当访问到下标 end 时,当前片段访问结束,当前片段的下标范围是 [start,end],长度为 end−start+1,将当前片段的长度添加到返回值,然后令 start=end+1,继续寻找下一个片段。

重复上述过程,直到遍历完字符串。

上述做法使用贪心的思想寻找每个片段可能的最小结束下标,因此可以保证每个片段的长度一定是符合要求的最短长度,如果取更短的片段,则一定会出现同一个字母出现在多个片段中的情况。由于每次取的片段都是符合要求的最短的片段,因此得到的片段数也是最多的。

由于每个片段访问结束的标志是访问到下标 end,因此对于每个片段,可以保证当前片段中的每个字母都一定在当前片段中,不可能出现在其他片段,可以保证同一个字母只会出现在同一个片段。

代码:

vector<int> partitionLabels(string s) {int last[26];int length = s.size();//先遍历一边记录位置for (int i = 0; i < length; i++) {last[s[i] - 'a'] = i;}vector<int> partition;int start = 0, end = 0;for (int i = 0; i < length; i++) {end = max(end, last[s[i] - 'a']);if (i == end) {partition.push_back(end - start + 1);start = end + 1;}}return partition;}

划分字母区间(双指针,贪心)相关推荐

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

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

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

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

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

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

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

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

  5. 贪心 - 划分字母区间

    题目链接 class Solution {public:vector<int> partitionLabels(string S) {int n = S.size();vector< ...

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

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

  7. 把数组排成最小的数字,划分字母区间,最小覆盖子串,验证回文字符串II

    面试题45:把数组排成最小的数字 输入一个正整数数组,把数组里所有的数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.这里自定义了一个排序规则. class Solution { publi ...

  8. LeetCode 763. 划分字母区间

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

  9. 763. Partition Labels 划分字母区间

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

最新文章

  1. Django之路由系统
  2. Concrete Math 混凝土数学(具体数学)随笔
  3. 【测试】有道云笔记数据导出备份功能体验测试
  4. php中的rand,预测PHP的rand()的输出
  5. oracle 删除表从回收站恢复
  6. 【Android】adb架构(客户端(shell/ddms/adt)+本地服务器+daemon)
  7. 逻辑漏洞——会话管理问题
  8. python删除列表元素_追求简单C++之删除STL列表的元素
  9. CF1548A Web of Lies
  10. jdk12源代码文件_JDK 11:轻松取出单文件Java源代码程序
  11. linux监控电脑配置,Zabbix基本配置及监控主机
  12. 如何查看自己运行ubuntu是32位还是64位
  13. 电子元器件检测与维修从入门到精通视频教程
  14. 《Java170道面试笔试题全面含答案》
  15. SpringBoot MongoDB 插入内容去掉_class字段
  16. 王者荣耀使用什么编程语言开发的?
  17. 操作系统之文件系统:4、文件存储空间管理(空闲表法、空闲链表法、位示图法、成组链接法)
  18. 多重共线性是如何影响回归模型的
  19. dq坐标系下无功功率表达式_基于瞬时电流分解的谐波电流检测方法研究
  20. js文件中引入js的方法

热门文章

  1. VS cmake 远程开发 opencv报错:CMake was unable to find a build program corresponding to “Ninja“.(换个构建方式)
  2. D455 如何同时传输视频深度流和惯性单元IMU流?(双管道方法与调用回调方法)
  3. 【中级软考】段页式存储是什么?
  4. Intel RealSense 数码相机和摄像机的ISO是什么意思?
  5. ROS安装配置相关问题
  6. 史上最详细Docker安装Mysql 带每一步详图及解释 并教你Docker 打印容器日志!!!相信值得你的阅读!!!
  7. 二叉树的基本操作_二叉树的遍历
  8. ubuntu 18.04无法开机 允许root用户桌面登录
  9. 汉字转拼音php代码函数,php中将汉字转换成拼音的函数代码
  10. 基于HTML在线考试系统开题报告,基于JSP的在线考试系统 开题报告.doc