LeetCode 763划分字母区间 详解
题目详情
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
示例 1:
输入: S = "ababcbacadefegdehijhklij"
输出: [9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
注意:
S的长度在[1, 500]之间。S只包含小写字母'a'到'z'。
题目分析
此题关键的想法就是找到能分割的条件, 对S的每个字符进行判断, 看是否此字符是被分割到另一个字符中。
通过分析题目可以知道, 要求一个字符只能出现在一个字符串里, 这里可以知道第一个条件:
- 当此字符在前面分割的出现,就不能当做分割点
但是这个条件显然是不够的,当出现前面分割的字符串没出现的字符时, 是不是能直接加进去呢? 这是不行的
考虑分割此字符串
aaaaabcdaefgh
当判断b的时候, 首先在前面已经分好的字符串aaaaa里面没有,符合条件。所以我们把b当做新的分割点。 单着显然是错误的,因为在b后面的字符串里,出现了a, 当我们以b作为分割点的话必定有两个分割的字符串,不符合条件。 所以第二个限制条件:
- 分割点后面不能出现前面一个字符串中的字符
综上条件我们可以得到结果
AC代码
class Solution {
public:
vector<int> partitionLabels(string S) {
//分割点前的字符串的字符种类 (这里不用存一个完整的字符串,只需要存字符串出现的种类就可以)
string contain_char = "";
//前一个字符串的长度
int strLen = 0;
//返回的数组
vector<int> re;
for (int i = 0; i < S.size(); i++) {
//当没有字符串被分割时
if(contain_char.size() == 0) {
contain_char += S[i];
strLen++;
continue;
}
//如果当前字母在原来的字符串里 就加入进去
if (contain_char.find(S[i]) != string::npos) {
strLen++;
} else {
//如果上一个string的包含的字符 在此字母后的string出现
//则说明此字符不是分割的地方, 把此字符加入到string
//而且更新contain_char
bool flag = false;
for (auto singleChar : contain_char) {
//后面有字符
if (S.find(singleChar, i+1) != string::npos) {
flag = true;
}
}
//如果后面有字符 就把当前字符加入到前面的字符串里
if (flag) {
contain_char += S[i];
strLen++;
} else {
contain_char = "";
contain_char += S[i];
re.push_back(strLen);
strLen = 1;
}
}
}
re.push_back(strLen);
return re;
}
};
总结
此题利用贪心算法是我对每一个S的字符, 在能把这个字符分离的情况下。 对每一个字符进行判断, 这样得到的字符串的数目应该是最多的
LeetCode 763划分字母区间 详解的更多相关文章
- Java实现 LeetCode 763 划分字母区间(暴力)
763. 划分字母区间 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = & ...
- leetcode 763. 划分字母区间
题目描述: 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = "a ...
- LeetCode:划分字母区间【763】
LeetCode:划分字母区间[763] 题目描述 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示 ...
- Cisco思科模拟器交换机划分VLAN 入门详解 - 精简归纳
Cisco思科模拟器交换机划分VLAN 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 24 转载请注明出处!️ 附: 交流方式: ️ ️ ️ QQ: 1846334075 We ...
- JS 之 每日一题 之 算法 ( 划分字母区间 )
题目详解: 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 例子: 示例 1: 输入:S = &quo ...
- LeetCode 115.不同的子序列 详解
题目详情 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例如, ...
- java虚拟机内存区域的划分以及作用详解
序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...
- [Swift]LeetCode763. 划分字母区间 | Partition Labels
A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...
- oracle中检索结果汉字首字母排序详解
今天写需求,要求将结果按照成本中心首字母排序,平且空放在最前面. 进入正题: 1.使用oracle自带的函数: 按照首字母排序:nlssort(xxx,'NLS_SORT=SCHINESE_PINYI ...
随机推荐
- Python Ethical Hacking - BACKDOORS(3)
BACKDOORS Sockets Problem: TCP is stream-based. Difficult to identify the end of message/batch. Solu ...
- react : umi 引入 antd 踩坑
首先要明确一个问题. 不管是 antd 还是 dva 还是别的什么东西,他们都是 umi 的插件——只要这个项目是使用 umi 脚手架生成的. 所以第一步应该是 .umirc.js (config.j ...
- Python的telnetlib模块使用
telnetlib模块的常用接口 telnetlib.Telnet(host, port, timeout) # 登录 write() # 输入命令 read_until(match) # 读出响应, ...
- 最简单的VScode Python 开发环境配置以及中文化
前置条件 Python 3.X(2020年了,建议使用Python3.X版本) 一.下载VSCode VSCode官方下载链接 由于安装过程是中文界面,此处略过. 二.VSCode中文化 不需要配置什 ...
- MVC + EFCore 项目实战 - 数仓管理系统7 - 数据源管理中--新增数据源
上篇我们完成了数据源列表展示功能(还未测试). 本篇我们来新增数据源,并查看列表展示功能. 接上篇: 二.数据源管理功能开发 2.新增数据源 我们用模态对话框来完成数据源的新增,效果如下图: 我们 ...
- ajax异步上传图片&SpringMVC后台代码
function uploadPic(){ var options = { url : "/upload/updatePic.action", type : "post& ...
- 分布式锁(2) ----- 基于redis的分布式锁
分布式锁系列文章 分布式锁(1) ----- 介绍和基于数据库的分布式锁 分布式锁(2) ----- 基于redis的分布式锁 分布式锁(3) ----- 基于zookeeper的分布式锁 代码:ht ...
- Java基础之(IO流)
简介: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. 一.File ...
- pandas之groupby分组与pivot_table透视
一.groupby 类似excel的数据透视表,一般是按照行进行分组,使用方法如下. df.groupby(by=None, axis=0, level=None, as_index=True, so ...
- MongoDB基本使用方法
mongo与关系型数据库的概念对比,区分大小写,_id为主键. 一.数据库操作 >show dbs或者show databases #查看所有数据库 >use dbname #创 ...