美文网首页
Leetcode_763_划分字母区间_hn

Leetcode_763_划分字母区间_hn

作者: 1只特立独行的猪 | 来源:发表于2020-03-22 21:07 被阅读0次

    题目描述

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

    示例

    示例 1:

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

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

    解答方法

    方法一:贪心

    思路

    不断地选择从最左边起最小的区间。可以从第一个字母开始分析,假设第一个字母是 'a',那么第一个区间一定包含最后一次出现的 'a'。但第一个出现的 'a' 和最后一个出现的 'a' 之间可能还有其他字母,这些字母会让区间变大。举个例子,在 "abccaddbeffe" 字符串中,第一个最小的区间是 "abccaddb"。
    通过以上的分析,我们可以得出一个算法:对于遇到的每一个字母,去找这个字母最后一次出现的位置,用来更新当前的最小区间。
    参考:https://leetcode-cn.com/problems/partition-labels/solution/hua-fen-zi-mu-qu-jian-by-leetcode/

    代码

    class Solution:
        def partitionLabels(self, S: str) -> List[int]:
            last = {c:i for i, c in enumerate(S)}
            flag = 0
            j = 0
            res = []
            for i,c in enumerate(S):
                j = max(j, last[c])
                if i == j:
                    res.append(j-flag+1)
                    flag = j+1
            return res
    

    时间复杂度

    O(N)O(N),其中 N 为 S 的长度。

    空间复杂度

    O(N)

    相关文章

      网友评论

          本文标题:Leetcode_763_划分字母区间_hn

          本文链接:https://www.haomeiwen.com/subject/gibyyhtx.html