给你一个字符串 s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s
。
返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:s = "ababcbacadefegdehijhklij" 输出:[9,7,8] 解释: 划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。
示例 2:
输入:s = "eccbbbbdec" 输出:[10]
提示:
1 <= s.length <= 500
s
仅由小写英文字母组成
思路:
先找出来每个字母第一次出现的下标和最后一次出现的下标,
接着问题就转化成了合并区间。
时间复杂度:O(N)
空间复杂度:O(1)
class Solution:
def partitionLabels(self, s: str) -> List[int]:
intervals = []
for letter in set(s):
left, right = s.index(letter), s.rfind(letter)
intervals.append([left, right])
# merge intervals
intervals.sort(key = lambda x: x[0])
if not intervals:
return [0]
res = []
start, end = intervals[0][0], intervals[0][1]
for s, e in intervals[1:]:
if end > s:
end = max(end, e)
else:
res.append(end - start + 1)
start, end = s, e
res.append(end - start + 1)
return res