题目描述
字符串 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)
网友评论