【代码】Python刷题

之前用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))

猜你喜欢

转载自blog.csdn.net/C_Python_/article/details/84940138