字符串 S 由小写字母组成。
我们要把这个字符串划分为尽可能多的片段,
同一字母最多出现在一个片段中。
返回一个表示每个字符串片段的长度的列表。
e.g.
“ababcbacadefegdehijhklij”
[[0, 8], [1, 5], [4, 7], [9, 14], [10, 15], [11, 11], [13, 13], [16, 19], [17, 22], [18, 23], [20, 20], [21, 21]]
解题思路:
s.find s.rfind 记录从左往右和从右往左字符出现位置
记录每个字母出现的最早最晚位置。问题就转化为了区间合并问题
class Solution(object):
def partitionLabels(self, s):
intervals = []
for i in range(26):
if s.count(chr(ord("a") + i)):
intervals.append( [s.find(chr(ord("a")+i)), s.rfind(chr(ord("a")+i))] )
# print(intervals)
intervals = sorted(intervals, key = lambda x:x[0] )
left, right = intervals[0][0], intervals[0][1]
res = []
for interval in intervals:
if interval[0] <= right:
right = max(right, interval[1])
else:
res.append([left, right])
left, right = interval[0],interval[1]
res.append([left, right])
return [interval[1]-interval[0]+1 for interval in res]