题目:
A string S of lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.
Example 1:
Input: S = “ababcbacadefegdehijhklij”
Output: [9,7,8]
Explanation:
The partition is “ababcbaca”, “defegde”, “hijhklij”.
This is a partition so that each letter appears in at most one part.
A partition like “ababcbacadefegde”, “hijhklij” is incorrect, because it splits S into less parts.
Note:
S will have length in range [1, 500].
S will consist of lowercase letters (‘a’ to ‘z’) only.
题解:
思路:
维持一个辅助数组,表示字符串中每一个字母在字符串中最后出现的位置,维持一个区间左边界变量以及一个当前区间最右边界,当当前已到达最右边界的时候,遍完全了一个区间的划分
版本1:
dic,mr,ans={c:S.rfind© for c in S},len(S),[0]
for i,c in enumerate(S):
if imr:
ans.append(mr-ans[-1])
else:
mr=max(dic[c],mr)
return ans[1:]
错误:更新长度逻辑错误
解决办法,新增一个左边界变量,指向上一个区间的最右边界,初始值为-1
l=-1
版本2:
def test(S):
dic,mr,ans,l={c:S.rfind© for c in S},-1,[],-1
for i,c in enumerate(S):
if imr:
ans.append(mr-l)
l=i
else:
mr=max(dic[c],mr)
return ans
错误,无法解决当区间长度为1的情况,改进:
dic,ans,l,mr={c:S.rfind© for c in S},[],-1,-1
for i,c in enumerate(S):
if i==mr or (i>mr and dic[c]==i):
ans.append(i-l)
l=i
else:
mr=max(mr,dic[c])
return ans