这个题解使用了贪心算法和哈希表的思路。首先遍历字符串,用两个哈希表 start 和 end 分别记录每个字符第一次出现的下标和最后一次出现的下标。然后再次遍历字符串,用一个变量 temp_end 记录当前片段的结束下标,初始化为第一个字符最后出现的下标。遍历过程中,如果当前下标小于 temp_end,说明当前字符属于当前片段,并更新 temp_end 为当前字符最后出现的下标和 temp_end 的较大值。如果当前下标等于 temp_end,说明当前片段结束,将片段长度加入结果数组,并将 temp_end 更新为下一个字符最后出现的下标。最后返回结果数组即可。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def partitionLabels(self, s: str) -> List[int]:
if not s:
return [0]
# 记录每个字符第一次出现和最后一次出现的下标
start = {}
end = {}
for i in range(len(s)):
if s[i] not in start.keys():
start[s[i]] = i
end[s[i]] = i
i = 0
temp_end = end[s[0]]
res = []
while i < len(s):
if i < temp_end:
# 如果当前字符属于当前片段,更新片段的结束下标
if end[s[i]] > temp_end:
temp_end = end[s[i]]
i += 1
elif i == temp_end:
# 如果当前片段结束,将片段长度加入结果数组
res.append(i-sum(res)+1)
i += 1
else:
# 开启新的片段
temp_end = end[s[i]]
return res