LeetCode-Python-763. 划分字母区间

644 篇文章 23 订阅

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

示例 1:

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

注意:

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

第一种思路:

只需要统计每个字母第一次出现的下标(find函数),和最后一次出现的下标的(rfind函数),就可以得到每个字母的区间范围,

比如示例1 的对应统计数组为: [[0, 8], [1, 5], [4, 7], [9, 14], [10, 15], [11, 11], [13, 13], [16, 19], [17, 22], [18, 23], [20, 20], [21, 21]]

然后题目就会转化为LeetCode-Python-56. 合并区间

class Solution(object):
    def partitionLabels(self, S):
        """
        :type S: str
        :rtype: List[int]
        """
        
        intervals = []
        for i in range(0, 26):
            if S.count(chr(ord("a") + i)):
                intervals.append([S.find(chr(ord("a") + i)), S.rfind(chr(ord("a") + i))])
            
        #print intervals
        intervals = sorted(intervals, key = lambda x: x[0])
        # print intervals
        
        left = intervals[0][0]
        right = intervals[0][1]
        res = list()
        for interval in intervals:
            if interval[0] <= right:
                right = max(right, interval[1])
            else:
                res.append([left, right])
                left = interval[0]
                right = interval[1]
                
        res.append([left, right])
        # print res
        return [interval[1] - interval[0] + 1 for interval in res]
        
            
        

第二种思路:

学习自评论区,

先扫描一遍整个S,建立一个字典,字典的键是字母,值是这个字母最后一次出现的下标,

然后再线性扫描S,设置变量right 用于表示分隔开的子字符串的末尾在S里的下标,变量left表示子字符串的开头在S里的下标

如果当前扫描的元素的最后一次出现的下标比right大,就说明子字符串还需要延长,就刷新right,

如果当前扫描的元素的下标已经达到了right,就说明这个子字符串完全已经找到了,就可以把答案添加到res中。 

class Solution(object):
    def partitionLabels(self, S):
        """
        :type S: str
        :rtype: List[int]
        """
        dic = {}
        
        for index, char in enumerate(S):
            dic[char] = index
        
        right = dic[S[0]]
        left = 0
        res = []
        for index, char in enumerate(S):
            right = max(right, dic[char])
            if index >= right:
                res.append(right - left + 1)
                left = right + 1
        
        return res
                
        
        
            
        

                                                         

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值