leetcode刷题250天(37)——763. 划分字母区间

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

e.g.
“ababcbacadefegdehijhklij”
[[0, 8], [1, 5], [4, 7], [9, 14], [10, 15], [11, 11], [13, 13], [16, 19], [17, 22], [18, 23], [20, 20], [21, 21]]

解题思路:
s.find s.rfind 记录从左往右和从右往左字符出现位置
记录每个字母出现的最早最晚位置。问题就转化为了区间合并问题

class Solution(object):
    def partitionLabels(self, s):

        intervals = []
        for i in range(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] )
        left, right = intervals[0][0], intervals[0][1]

        res = []

        for interval in intervals:
            if interval[0] <= right:
                right = max(right, interval[1])
            
            else:
                res.append([left, right])
                left, right = interval[0],interval[1]
            
        res.append([left, right])
        
        return [interval[1]-interval[0]+1 for interval in res]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值