Leetcode_763_划分字母区间_hn

题目描述

字符串 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)