1、题目描述
https://leetcode-cn.com/problems/partition-labels/
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
返回一个表示每个字符串片段的长度的列表。
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
【解释】划分结果为 "ababcbaca", "defegde", "hijhklij"。每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
S的长度在[1, 500]之间。 S只包含小写字母 'a' 到 'z' 。
2、代码详解
- 看见开头一个字母,就要看这个字母最后出现在哪,
- 然后看这个开头和结尾之间的那些其他字母是不是都落在这个区间里,
- 如果不是,则扩充区间,如果是,那就最好了
- 利用字典key的唯一性来记载一个字母最大的index是几。
- 然后,遍历字符串并跟它比较,用max函数来看看是边界大还是当前遍历的这个字母的最大index大,
- 如果当前遍历字母的最大index大,那就说明超过了边界,那就要更新边界
class Solution(object):
def partitionLabels(self, S):
"""
:type S: str
:rtype: List[int]
"""
maxIndex = dict()
# 记录每个字符最后的位置
for i in range(len(S)):
maxIndex[S[i]] = i # 键是字母,值是这个字母最后一次出现的下标
res = []
# 当前片段开始位置和结束位置
start = 0 # 子字符串的开头在S里的下标
end = 0 # 分隔开的子字符串的末尾在S里的下标
# 遍历整个字符串S,寻找所有合适的解
for i in range(len(S)):
end = max(maxIndex[S[i]], end) # 当前扫描的元素的最后一次出现的下标比end大,就说明子字符串还需要延长,就刷新end
if i == end: # 当前扫描的元素的下标已经达到了end,就说明这个子字符串完全已经找到了,答案添加到res中。
res.append(end - start + 1)
start = end + 1
return res
相似题