Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查给定起点和终点的字符串列表中的路径_Python_String_Search_Path_Divide And Conquer - Fatal编程技术网

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

Python 检查给定起点和终点的字符串列表中的路径,python,string,search,path,divide-and-conquer,Python,String,Search,Path,Divide And Conquer,我们的任务是创建一个程序,在给定长度相同的字符串列表的情况下,该程序将检查是否存在从起始字符串到结束字符串的可能方式。有一个问题,如果两个字符串只有一个不同的字符,我们只能从当前字符串转到相邻字符串。如果从开始字符串到结束字符串没有可能的路径,只需打印不可能,但如果有,则输出从开始到结束的步数 Example: li = ["booster", "rooster", "roaster", "coaster", &qu

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

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)))
def检查器(str1、str2、更改=0): 对于索引,枚举中的字符(str1):#遍历整个 如果是字符!=str2[索引]:#字符串并检查 更改+=1#字符差异 如果change==1,则返回True,否则返回False#只有1个字符不同 li=[“助推器”、“公鸡”、“烤炉”、“杯垫”、“滑行”] m=len(li) 对于范围(m)中的j:li.append(input()) 开始,结束=输入().split() 如果end in li:endI=li.index(end)#获取列表中的结束字符串索引 其他: 打印(“不可能”) 打破 如果在li中开始:startI=li.index(start)#获取列表中的开始字符串索引 其他: 打印(“不可能”) 打破 if startI0: 如果不是检查人(li[startI],li[startI-1]): 打印(“不可能”) 打破 startI-=1 打印(abs(起始索引(起始)+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))
导入正则表达式
定义单词路径(单词、开始、结束):
如果以文字结尾,以文字开头:
endI=单词索引(end)
startI=words.index(开始)
其他:
返回“不可能”

步骤=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))
导入正则表达式
定义单词路径(单词、开始、结束):
如果以文字结尾,以文字开头:
endI=单词索引(end)
startI=words.index(开始)
其他:
返回“不可能”

步骤=1,如果startI它应该是正则表达式。Regex提供了额外的正则表达式功能,例如,它可以检查许多错误{e它应该是Regex。Regex提供了额外的正则表达式功能,例如,它可以检查许多错误{我认为它应该是
re
而不是
regex
。无论如何,我尝试了你的代码,但它输出
不可能
,因为输入
roaster booster
是错误的。它应该输出
3
。我认为它应该是
re
而不是
regex
。无论如何,我尝试了你的代码,但它输出
 不可能
对于输入
烘焙器助推器
来说,这是错误的。它应该输出
3
。这很奇怪。我使用Thonny,当我使用你的代码时,它报告没有名为
regex的模块。这很奇怪。我使用Thonny,当我使用你的代码时,它报告没有名为
regex的模块