字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
提示:
S
的长度在[1, 500]
之间。S
只包含小写字母'a'
到'z'
。
- 贪心双指针问题
- 先构建哈希表,key为字符,value为字符在S中出现的最远位置
- 遍历S,时刻更新当前最远位置
last = max(last, index2reindex[S[i]])
- 若
i == last
,则将计数器的值cnt写入结果,并cnt清零
class Solution:
def partitionLabels(self, S: str) -> List[int]:
index2reindex = {s: index for index, s in enumerate(S)}
cnt, res = 0, []
last = index2reindex[S[0]]
for i in range(len(S)):
cnt += 1
last = max(last, index2reindex[S[i]])
if i == last:
res.append(cnt)
cnt = 0
return res