class Solution:
def partitionLabels(self, S: str) -> List[int]:
# 先确定思路:看见开头一个字母,就要看这个字母最后出现在哪,然后康康这个开头和结尾之间的那些其他字母是不是都落在这个区间里,
# 如果不是,则扩充区间,如果是,那就最好了ww。
# 另一点是确定用什么方法,很多题你不看参考答案真的想不出来要走哪条路,倒不是说这条路有多难,而是不能确定到底应该往哪个方向去想。
# 对于这道题,一个关键点是利用字典key的唯一性来记载一个字母最大的index是几。
# 然后,遍历字符串并跟它比较,用max函数来康康是边界大还是当前遍历的这个字母的最大index大,
# 如果当前遍历字母的最大index大,那就说明超过了边界,那就要更新边界,大概就是这个思路。
# 结合我说的,康康下面的代码哈。
max_index = {item: idx for idx, item in enumerate(S)} # 这样写就是一个键:一个值,然后通过遍历来更新到最大的那个index
start, end = 0, 0 # 起始边界, 结束边界
ans = []
for idx, i in enumerate(S):
end = max(end, max_index[i]) # 这里就是用边界和当前遍历到的那个字母的最大index去比较,看看谁大,
# 如果最大index大就扩充边界。
if idx == end: # 最后,遍历的位置和边界重合了,那就ok了,从这里截断并记录长度。 就这些,可以再慢慢理解下。
ans.append(end - start + 1)
start = idx + 1
return ans
# 以上