字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:S = "ababcbacadefegdehijhklij" 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
提示:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-labels
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
关于合并区间,请参考:http://timd.cn/leetcode/merge-intervals/。
先通过一次遍历,得到每个字符的(起始索引、终止索引),然后将问题转化为合并区间。
class Solution(object):
def merge(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: List[List[int]]
"""
if not intervals or len(intervals) == 1:
return intervals
intervals.sort()
ret = []
current_left = intervals[0][0]
current_right = intervals[0][1]
for ind, (left, right) in enumerate(intervals[1:], start=1):
if left >= current_right:
current_right = max(right, current_right)
else:
ret.append([current_left, current_right])
current_left = left
current_right = right
if ind == len(intervals) - 1:
ret.append([current_left, current_right])
return ret
def partitionLabels(self, S):
"""
:type S: str
:rtype: List[int]
"""
d = {}
for ind, ch in enumerate(S):
if ch not in d:
d[ch] = [ind, ind]
else:
d[ch][1] = ind
intervals = sorted(d.values(), key=lambda t: t)
ret = []
for left, right in self.merge(intervals):
ret.append(right - left + 1)
return ret