之前用C刷LeetCode,也就刷了60道吧,结果后来也不刷了。。。
现在主要用Python,刷一些题目熟悉语法,当然还有数据结构和算法。
给定一个数组 strs,其中的数据都是字符串,给定两个字符串 str1,str2。如果这两个字符串都在 strs数组中,就返回它们之间的最小距离;如果其中任何一个不在里面,则返回 -1;如果两个字符串相等,则返回 0。
例如:给定[‘’,’3’,’’,’5’,’10’,’9’,’7’,’1’,’’],再给定两个字符串’ ‘和’9’,通过函数求得返回值 3。
def min_distance(ss, s1, s2):
if s1 not in ss or s2 not in ss:
return -1
if s1 == s2:
return 0
index1 = []
for i in range(len(ss)):
if ss[i] == s1:
index1.append(i)
index2 = []
for i in range(len(ss)):
if ss[i] == s2:
index2.append(i)
# 获取两个元素的索引,存入索引列表,并将其合并为一个索引总列表,并排序
index3 = sorted(index1+index2)
# 存储索引差,即字符串距离
step = []
for i in range(len(index3)-1):
# 如果索引总列表中相邻两个元素索引分别为两个元素的索引,则将其添加到索引差列表中
if index3[i] in index1 and index3[i+1] in index2 or \
index3[i] in index2 and index3[i+1] in index1:
step.append(index3[i+1] - index3[i])
# 找出索引差最小,即字符串最小距离
print(min(step))
测试用例:
s = ['*', '3', '*', '5', '10', '9', '7', '3', '*']
s11 = '3'
s22 = '9'
min_distance(s, s11, s22)
100 0000次运行,时间约为2.70s,原文代码为3.67s,使用标记的办法改进,时间1.78s
def min_distance2(ss, s1, s2):
if s1 not in ss or s2 not in ss:
return -1
if s1 == s2:
return 0
# 双标记
id1 = -1
id2 = -1
step = []
for i in range(len(ss)):
if ss[i] == s1:
id1 = i
elif ss[i] == s2:
id2 = i
if id1 == -1 or id2 == -1:
continue
else:
# 双标记的差的绝对值即为距离
step.append(abs(id1-id2))
# print(min(step))