题目详情

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

示例 1:

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

注意:

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

题目分析

此题关键的想法就是找到能分割的条件, 对S的每个字符进行判断, 看是否此字符是被分割到另一个字符中。

通过分析题目可以知道, 要求一个字符只能出现在一个字符串里, 这里可以知道第一个条件:

  • 当此字符在前面分割的出现,就不能当做分割点

但是这个条件显然是不够的,当出现前面分割的字符串没出现的字符时, 是不是能直接加进去呢? 这是不行的

考虑分割此字符串

aaaaabcdaefgh

当判断b的时候, 首先在前面已经分好的字符串aaaaa里面没有,符合条件。所以我们把b当做新的分割点。 单着显然是错误的,因为在b后面的字符串里,出现了a, 当我们以b作为分割点的话必定有两个分割的字符串,不符合条件。 所以第二个限制条件:

  • 分割点后面不能出现前面一个字符串中的字符

综上条件我们可以得到结果

AC代码

  1. class Solution {
  2. public:
  3. vector<int> partitionLabels(string S) {
  4. //分割点前的字符串的字符种类 (这里不用存一个完整的字符串,只需要存字符串出现的种类就可以)
  5. string contain_char = "";
  6. //前一个字符串的长度
  7. int strLen = 0;
  8. //返回的数组
  9. vector<int> re;
  10. for (int i = 0; i < S.size(); i++) {
  11. //当没有字符串被分割时
  12. if(contain_char.size() == 0) {
  13. contain_char += S[i];
  14. strLen++;
  15. continue;
  16. }
  17. //如果当前字母在原来的字符串里 就加入进去
  18. if (contain_char.find(S[i]) != string::npos) {
  19. strLen++;
  20. } else {
  21. //如果上一个string的包含的字符 在此字母后的string出现
  22. //则说明此字符不是分割的地方, 把此字符加入到string
  23. //而且更新contain_char
  24. bool flag = false;
  25. for (auto singleChar : contain_char) {
  26. //后面有字符
  27. if (S.find(singleChar, i+1) != string::npos) {
  28. flag = true;
  29. }
  30. }
  31. //如果后面有字符 就把当前字符加入到前面的字符串里
  32. if (flag) {
  33. contain_char += S[i];
  34. strLen++;
  35. } else {
  36. contain_char = "";
  37. contain_char += S[i];
  38. re.push_back(strLen);
  39. strLen = 1;
  40. }
  41. }
  42. }
  43. re.push_back(strLen);
  44. return re;
  45. }
  46. };

总结

此题利用贪心算法是我对每一个S的字符, 在能把这个字符分离的情况下。 对每一个字符进行判断, 这样得到的字符串的数目应该是最多的

LeetCode 763划分字母区间 详解的更多相关文章

  1. Java实现 LeetCode 763 划分字母区间(暴力)

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

  2. leetcode 763. 划分字母区间

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

  3. LeetCode:划分字母区间【763】

    LeetCode:划分字母区间[763] 题目描述 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示 ...

  4. Cisco思科模拟器交换机划分VLAN 入门详解 - 精简归纳

    Cisco思科模拟器交换机划分VLAN 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 24 转载请注明出处!️ 附: 交流方式: ️ ️ ️ QQ: 1846334075 We ...

  5. JS 之 每日一题 之 算法 ( 划分字母区间 )

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

  6. LeetCode 115.不同的子序列 详解

    题目详情 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例如, ...

  7. java虚拟机内存区域的划分以及作用详解

    序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...

  8. [Swift]LeetCode763. 划分字母区间 | Partition Labels

    A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...

  9. oracle中检索结果汉字首字母排序详解

    今天写需求,要求将结果按照成本中心首字母排序,平且空放在最前面. 进入正题: 1.使用oracle自带的函数: 按照首字母排序:nlssort(xxx,'NLS_SORT=SCHINESE_PINYI ...

随机推荐

  1. CPU核数

    今天想看CPU核数,又忘记怎么看了QAQ. CPU的基本信息都被记录在/proc/cpuinfo中,一般直接cat /proc/cpuinfo就可以了. 主要是学习一下物理cpu核数/逻辑cpu核数的 ...

  2. 通过Vue实现的todolist

    和接口对接的todolist因为有后台的存在,todolist获取的数据会一直存在不丢失(不管你如何刷新页面),思路如下: 首先得先搞到接口: 通过这个接口地址可以获取整段的数据,成功err为0. 于 ...

  3. [jvm] -- 常用内存参数配置篇

    新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ) Eden : from : to = 8 : 1 : 1 ( 可 ...

  4. CentOS 7配置网卡信息,并设置yum为阿里云的镜像源

    一.问题场景 使用virtualbox创建的centos 7版本的linux虚拟机,使用ping mirrors.aliyun.com有返回,但是wget -O /etc/yum.repos.d/ep ...

  5. class初探

    我们说类的时候,先回忆一下es5的构造函数 function myobj(x,y){ this.x= x; this.y =y; } myobj.prototype.add = function(){ ...

  6. LaTeX公式学习

    简介 本文公式较多可能有加载较慢. 使用 LaTeX 的主要原因之一是它可以方便地排版公式.我们使用数学模式来排版公式. 公式 插入公式 可以用一对$来启用数学模式. 行中公式可以用如下方法: $数学 ...

  7. springboot(12)Redis作为SpringBoot项目数据缓存

    简介: 在项目中设计数据访问的时候往往都是采用直接访问数据库,采用数据库连接池来实现,但是如果我们的项目访问量过大或者访问过于频繁,将会对我们的数据库带来很大的压力.为了解决这个问题从而redis数据 ...

  8. sed打印包含一个字符串的行到包含另一个字符串的行解答

    sed -n '/字符串1/,/字符串2/p' filename  这个命令为什么有时候打印不出来想要的东西,例如:sed -n '/root/,/adm/p'  /etc/passwd      我 ...

  9. redis基本操作介绍

    一.字符串 单个设置:set key value,如果key不存在则设置键值对,如果存在则修改 批量设置:mset key1 value1 [key2 value2] 单个获取:get key,如果k ...

  10. 02 . Beego框架结构组织,路由及项目初始化

    Beego项目组织结构 conf conf:项目配置文件所在的目录,项目中有一些全局的配置都可以放在此目录下.默认的app.conf文件中默认指定了三个配置: // 1)appname = Beego ...