Python刷leetcode--763.划分字母区间

本文介绍了如何使用Python实现一个高效的算法,通过两次遍历字符串S,利用哈希表统计字母出现的最晚位置,然后根据这些信息划分出每个字母只出现一次的片段。示例和提示帮助理解问题,适用于字符串处理和贪心算法的学习者。
摘要由CSDN通过智能技术生成

时间复杂度O(N)
空间复杂度O(N)

只需要遍历两遍字符串,第一遍用hash表统计每个字母出现的最大下标。就是最晚出现的下标。
第二遍分段,每一段都记录一个left,right就是当前下标。用一个max_ind记录当前段遍历过的最大下标,如果当前坐标等于最大下标,就开始下一段的记录。并把当前的结果加入ans结果集。
[盗一下大佬的图片。]在这里插入图片描述

# 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。 
# 
#  
# 
#  示例 1: 
# 
#  输入:S = "ababcbacadefegdehijhklij"
# 输出:[9,7,8]
# 解释:
# 划分结果为 "ababcbaca", "defegde", "hijhklij"。
# 每个字母最多出现在一个片段中。
# 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
#  
# 
#  
# 
#  提示: 
# 
#  
#  S的长度在[1, 500]之间。 
#  S只包含小写字母 'a' 到 'z' 。 
#  
#  Related Topics 贪心算法 双指针 
#  👍 330 👎 0


# 763.划分字母区间

# leetcode submit region begin(Prohibit modification and deletion)
from typing import List


class Solution:
    def partitionLabels(self, S: str) -> List[int]:
        ans = []
        my_map = {}
        max_ind = 0
        right = 0
        left = 0
        for indexi,i in enumerate(S):
            my_map[i] = indexi
        # dic = {s: index for index, s in enumerate(S)}
        for indexi,i in enumerate(S):
            max_ind = max(max_ind, my_map[S[indexi]])
            if indexi == max_ind:
                ans.append(indexi-left+1)
                left = indexi + 1
        return ans



if __name__ == '__main__':
    sol = Solution()
    sol.partitionLabels("ababcbacadefegdehijhklij")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值