在给定起点和终点的字符串列表中检查路径

Posted

技术标签:

【中文标题】在给定起点和终点的字符串列表中检查路径【英文标题】:Checks for a Path in a List of Strings Given a Starting and Ending Point 【发布时间】:2021-03-15 05:33:24 【问题描述】:

我们的任务是创建一个程序,在给定具有相同长度的字符串列表的情况下,该程序将检查是否存在从起始字符串到结束字符串的可能方式。有一个问题,如果两个字符串只有一个不同的字符,我们只能从当前字符串转到相邻字符串。如果从起始字符串到结束字符串没有可能的路径,则打印not possible,如果有,则输出从开始到结束的步数。

Example:
li = ["booster", "rooster", "roaster", "coaster", "coasted"]
start = "roaster"
end = "booster"

Output: 3

li = ["booster", "rooster", "roaster", "coastal", "coasted"]
start = "roaster"
end = "coasted"

Output: none

我做了一种方法,手动检查相邻字符串是否只有 1 个字符差异,并根据这些差异返回结果。考虑到列表的长度可能最多为 100,如果你问我,这有点慢。你能展示一个更快的方法吗?

def checker(str1, str2, change = 0):

    for index, character in enumerate(str1):      # Traverses the whole
        if character != str2[index]:              # string and checks for   
            change+=1                             # character differences 
                                                  

    return True if change == 1 else False              # Only 1 character is different

li = ["booster", "rooster", "roaster", "coaster", "coasted"]
m = len(li)

for j in range(m): li.append(input())
start, end = input().split()

if end in li: endI = li.index(end)               # Gets end string index in the list
else:
    print("not possible")
    break

if start in li: startI = li.index(start)         # Gets start string index in the list
else:
    print("not possible")
    break

if startI < endI:                                # If start string comes first before 
                                                 # the end string, keep incrementing.

    while li[startI] != end and startI < m-1:

        if not checker(li[startI], li[startI+1]):
            print("not possible")
            break

        startI += 1

    print(abs(startI-(li.index(start)+1)))

else:                                            # Otherwise, keep decrementing.                                             

    while li[startI] != end and startI > 0:

        if not checker(li[startI], li[startI-1]):
            print("not possible")
            break

        startI -= 1

    print(abs(startI-(li.index(start)+1)))

如果我的方法是最快的(我非常怀疑),我想知道我的方法是否存在漏洞。假设在给定的列表中也可以不存在开始和结束字符串。如果它们不在列表中,只需打印not possible

【问题讨论】:

【参考方案1】:

我希望看起来更好:

import regex

def word_path(words, start, end):
    if end in words and start in words:
        endI = words.index(end)
        startI = words.index(start)
    else:
        return "not possible"

    step = 1 if startI <= endI else -1

    for index in range(startI, endI, step):
        if not regex.match("(%s)e<=1" %li[index], li[index + step]):
            return "not possible"
    return abs(startI - endI) + 1

li = ["booster", "rooster", "roaster", "coastal", "coasted"]
start, end = input().split()
print(word_path(li, start, end))

【讨论】:

我认为应该是re 而不是regex。无论如何,我尝试了您的代码,但它为输入 roaster booster 输出 not possible,这是错误的。它应该输出3【参考方案2】:

它应该是正则表达式。 Regex 提供了额外的正则表达式功能,例如它可以检查许多错误 e

regex_module

【讨论】:

这很奇怪。我正在使用 Thonny,当我使用您的代码时,它报告说没有名为 regex 的此类模块。

以上是关于在给定起点和终点的字符串列表中检查路径的主要内容,如果未能解决你的问题,请参考以下文章

在图中运行 DFS 的问题

在Shapely中查找路径起点的坐标距离

NOIP 2017 集训散记

寻找道路

寻找道路

起点和终点列表的基本非加权寻路