博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode】贪心算法--划分字母区间(763)
阅读量:7038 次
发布时间:2019-06-28

本文共 1276 字,大约阅读时间需要 4 分钟。

写在前面

今天这篇文章是贪心算法系列的第三篇--划分字母区间。

前文回顾:

刷题汇总:

今日题目

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

示例 1:

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

注意:

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

题目分析

解决此题关键就是找到能分割的条件,对S的每个字符进行判断,看是否此字符是被分割到另一个字符中,从题目中得到每个字母最多出现在一个片段中,那么从第一个字符开始,它的最后一个相同的字符一定在这个片段中,得到第一个条件:

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

只有这个条件就可以了吗?我们再考虑一下,当前字符并没有在前面分割的区间中出现,是不是能直接作为分割点呢?以下面的字符串为例进行分割。

“aaaaab cdaefgh”

当判断b的时候,先在前面已经分好的字符串aaaaa里面没有,符合找到的第一个条件,如果我们把b当做新的分割点,很明显是错误的,因为在b后面的字符串里,又一次出现了a,当我们以b作为分割点是不符合条件的,因此得到第二个限制条件:
分割点后面不能出现前面一个字符串中的字符。

进行了上面的分析但是可以用python做个弊,使用rindex()方法,从第一个字符开始,假设位置为a,用rindex方法找到最后一次出现的位置b,那么这个区间就为[a,b]。之后每个字符都找最后一个位置,如果在区间之外则扩大区间,如果遍历到区间的最后一个位置,则结束,长度就为结束位置减开始位置加1。

代码实现

class Solution:

def partitionLabels(self, S):    """    :type S: str    :rtype: List[int]    """    i = 0    res = []    while i < len(S):        start = i        end = S.rindex(S[i])        for j in range(i,len(S)):            last = S.rindex(S[j])            if last > end:                end = last            elif j == end:                res.append(end-start + 1)                i = end + 1                break    return res

推荐阅读:

转载地址:http://yzfal.baihongyu.com/

你可能感兴趣的文章
一些开源搜索引擎实现——倒排使用原始文件,列存储Hbase,KV store如levelDB、mongoDB、redis,以及SQL的,如sqlite或者xxSQL...
查看>>
2层,3层,4层交换机的区别与特点
查看>>
你理解这些Cisco NAT分类和原理吗
查看>>
Lync Server 2010 呼叫寄存配置和启用
查看>>
FusionChartsFree的JSP标签开发
查看>>
156个Python网络爬虫资源,GitHub上awesome系列之Python爬虫工具
查看>>
从零开始学习C语言(二)之daemon,socket连接
查看>>
(整理)岗位核心竞争力—UED(交互设计师)
查看>>
EDR 工具
查看>>
线程池及并发编程基础总结
查看>>
window.opener.document
查看>>
091019 T AddIn
查看>>
[转] C#中out和ref之间的区别
查看>>
ADO.NET中取得数据库字段的数据类型
查看>>
数据可视化之风向图
查看>>
vista 登录画面修改
查看>>
DNS查询报文实例
查看>>
工业化生产:简单工厂、工厂方法和抽象工厂模式
查看>>
利用JDK1.5的工具对远程的Java应用程序进行监测(摘录)
查看>>
开源实时消息推送系统 MPush
查看>>