from re import I
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param s string字符串
# @return int整型一维数组
#
class Solution:
def splitString(self , s: str) -> List[int]:
# write code here
di = {}
# 存储每种字符的起始节点和结束节点,由于i从0开始,得到的结果di['x'][0]一定是有序的
for i in range(len(s)):
if s[i] not in di:
di[s[i]] = [i,i]
else:
di[s[i]][-1] = i
start,end = 0,0
ret = []
# 初始化[start,end]后遍历列表,共三种可能,
# 1.下一个区间和旧区间有重合部分,即l<end ,且r > end则更新end=r
# 2.下一个区间被旧区间完全包含,即l<end r<end,[start,end]不更新进入下一个循环
# 3.下一个区间和旧区间没有重合,则将旧区间的字符数加入结果,更新start和end为当前区间l,r
# 循环结束后把最后一个区间的字符加入结果,之所以l<=end,而不是 < ,是考虑到初始区间0,0
for item in di.values():
l,r = item
if l<=end:
if r > end:
end = r
elif l > end:
ret.append(end-start+1)
start,end=l,r
ret.append(end-start+1)
return ret