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

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

提示:

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

思路:看到题目先想到了把S拆成两段(如果S可划分),之后把拆开的S分段再进行拆分(如果可拆分),如果不可拆分就把当前分段

的长度写入结果链表

1.怎么判断是不是可拆分?

先保存当前字符串各字符数量(用map,数组都可以),之后复制一下先前统计的结果,然后从头开始遍历,执行--操作。如果当前字符的数量为0,那就说明该字符只出现在当前字符与当前字符前面,这个字符是可以拆分的,开始看他前面的字符是不是都可以拆分,如果他前面的字符当前的数量不为0,说明后面还有,继续向下遍历。如果当前字符前面的字符的也都不出现在后面,说明该字段可以拆分。

2.实现

可拆分:继续拆

不可拆分:当前字符长度保存进结果链表

代码:

class Solution {List<Integer> result = new ArrayList<>();void chaifen(String s){if(s.length()==0){return ;}int arr[] = new int[26];//统计各字符出现的次数for(int i=0;i<s.length();i++){arr[s.charAt(i)-'a']+=1;}int brr[] = arr;int index = 0;for(int i=0;i<s.length();i++){brr[s.charAt(i)-'a']-=1;int j=0;//当前字符的数量为0,说明不会出现在后面了if(brr[s.charAt(i)-'a']==0){//检索前面的字符是不是也都不会出现在后面for(j=0;j<=i;j++){if(brr[s.charAt(j)-'a']!=0){break;}}}//index记录可以拆分的位置,如果不可拆分,位置就是字符串尾部if(j>i){index = i;break;}}if(index!=s.length()-1){chaifen(s.substring(0,index+1));chaifen(s.substring(index+1,s.length()));}else{result.add(s.length());}}public List<Integer> partitionLabels(String S) {chaifen(S);return result;}
}

Leetcode--763. 划分字母区间相关推荐

  1. LeetCode 763. 划分字母区间

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

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

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

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

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

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

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

  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. 划分字母区间(双指针,贪心)

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

  10. Leetcode每日一题:763.partition-labels(划分字母区间)

    题意大概是:对于所给字符串S,把它分成几个部分,使得相同的字母只出现在同一个部分: 思路:先扫描一遍字符串,记录下每个字符最后出现的位置:然后利用双指针遍历字符串,设置变量end用于表示分隔开的子字符 ...

最新文章

  1. Android Input系统之触摸屏
  2. 【铜】第174-9篇 一对一视频录制(九)一对多学生端删除白板及nginx下配CI
  3. matlab for循环_从零开始的matlab学习笔记——(5)循环
  4. 滚动条——WPF ScrollViewer的应用
  5. sql server修改字段编码格式_关于MySQL如何修改character_set_client的编码问题
  6. win10死机频繁怎么解决
  7. 清华大学计算机科学与技术在哪个楼,清华大学计算机科学与技术系宿舍
  8. 两万字深度介绍分布式系统原理!【收藏版】
  9. Paraview 5.9.0升级为Paraview 5.10.0之后报错
  10. 【软件工程】绘制状态转换图
  11. poscms统计数据调用
  12. WPS表格 JSA-单格内,按文字颜色处理文字
  13. 云计算发展前景好不好 学了后能胜任哪些岗位
  14. 腾讯视频2019面试题目分享
  15. WebGL技术学习之路
  16. 03 JavaScript的学习笔记
  17. 字典树(Trie,前缀树)
  18. 爬虫、网页分析解析辅助工具 Xpath-helper
  19. 历史上的今天:苹果推出初代 iMac;谷歌收购摩托罗拉移动;Fuchsia 首次发布
  20. C#使用Access2003

热门文章

  1. 我爱加菲之加菲语录……
  2. handbrake 下载是php,Handbrake 优秀开源视频转换软件
  3. OSB集成平台项目-回顾 (Oracle service bus)
  4. c语言人民币大小写转换,人民币大小写转换函数.xls
  5. clr20r3 system.InvalidOperationException 程序终止的几种解决方案
  6. 手机通过USB分享网络给树莓派
  7. 基于springboot+vue的ERP系统
  8. 金蝶云星空与奇门WMS-AWMS-委外领料单对接出库单
  9. 抖音直播憋单大家都知道怎么做,但是你话术脚本里有细节吗? #播动师
  10. 音频AAC编码的RTMP直播