本题注意点:
1、利用index()查找,可能找不到时要用try语句;
2、查找所有值为x的indexes,可以用内置函数enumerate(),详见version2;
3、version3用动态规划,效率更高。
import numpy as np
def shortestToChar(S, C):
"""
:type S: str
:type C: str
:rtype: List[int]
"""
T = S
indexes = []
while(True):
try:
cur = T.index(C)
if len(indexes) == 0:
indexes.append(cur)
else:
indexes.append(indexes[-1]+cur+1)
T = T[cur+1:]
except:
break
ans = []
for i in range(len(S)):
j = 0
while(j < len(indexes) and indexes[j] < i):
j += 1
if j == 0:
ans.append(indexes[j]-i)
elif j == len(indexes):
ans.append(i-indexes[j-1])
else:
ans.append(min(indexes[j]-i, i-indexes[j-1]))
return ans
# version2:
# pos = [i+1 for i,e in enumerate(S) if e == C]
# a = []
# outs = []
# for i in range(1,len(S)+1):
# a = [abs(i-j) for j in pos]
# outs.append(min(a))
# return outs
# version3:
# n = len(S)
# result = [0 if ch == C else n for ch in S]
#
# for i in xrange(1, n):
# result[i] = min(result[i - 1] + 1, result[i])
# for i in xrange(n - 2, -1, -1):
# result[i] = min(result[i + 1] + 1, result[i])
# return result
S = "loveleetcode"
C = 'e'
print(shortestToChar(S, C))