Enlace de la pregunta diaria de Leetcode
: 763. Divida el intervalo de letras para
resolver el problema: preprocese la posición del último carácter de todos los mismos caracteres, marque esta posición para cada carácter ( O (n) ) y luego recorra todo el String ( O (n )), la posición más grande encontrada dinámicamente es la posición dividida. La siguiente figura es un ejemplo (solución inversa):
Solución del problema:
class Solution:
def partitionLabels(self, S: str) -> List[int]:
slist = list(S)
slist.reverse()
slen = len(slist)
# position 记录最后的位置,visit标记
position = []
visit = {
}
index = slen
# 求解位置
for c in slist:
# print(c)
if visit.get(c, -1) == -1:
visit[c] = index
position.append(visit[c] - 1)
index -= 1
position.reverse()
index, max_position = 0, 0
result = []
# 动态找到最长的长度
for key in position:
if key > max_position:
max_position = key
# 找到了最长的长度,求划分以后的长度
if index == max_position:
if len(result) == 0:
result.append(max_position)
else:
result.append(max_position-sum(result))
index += 1
# 对于第一个还要加上1,由于第一个是取得下标
result[0] += 1
return result