问题描述
解题思路
- 用 pre[i] 记录第 i 位置上的字母上一次出现的位置,
- 用 next[i] 记录第 i 位置上的字母下一次出现的位置;
- 往左最多能延伸到 pre[i] + 1,其到第 i 个字母一共有 i - pre[i] 个字母;
- 同理往右最多能延伸到 next[i]- 1,其到第 i 个字母一共有 next[i] - i 个字母;
- 二者相乘,就是该 i 位置上的字母被不同子串所包含的总次数。
个人见解
代码
list1=list(input())
pre=[-1 for i in range(len(list1))] # i位置元素的前一个相同元素位置
next=[len(list1) for i in range(len(list1))] # i位置元素的后一个相同元素位置
count=0
for i in range(1,len(list1)):
for j in range(i-1,-1,-1):
if list1[j]==list1[i]:
pre[i]=j
break
for i in range(0,len(list1)-1):
for j in range(i+1,len(list1)):
if list1[j]==list1[i]:
next[i]=j
break
for i in range(len(list1)):
count+=(i-pre[i])*(next[i]-i)
print(count)