Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/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_List_Recursion_Search_Divide And Conquer - Fatal编程技术网

Python 搜索将字符串转换为另一个字符串的最短方法,在给定列表中一次转换一个字符

Python 搜索将字符串转换为另一个字符串的最短方法,在给定列表中一次转换一个字符,python,list,recursion,search,divide-and-conquer,Python,List,Recursion,Search,Divide And Conquer,给定长度相同的字符串的列表,搜索将开始字符串转换为结束字符串的方法,每次转换一个字符,使每个转换后的字符串仍然存在于字符串的列表中 输入 对于测试用例的数量,输入从T开始。然后,在另一行出现m,询问要放入列表的字符串数m行要求相同长度的字符串,然后,最后一行由start和end组成,用空格分隔 例如: List: ["booster", "rooster", "roaster", "coaster", "c

给定长度相同的字符串的
列表
,搜索将
开始
字符串转换为
结束
字符串的方法,每次转换一个字符,使每个转换后的字符串仍然存在于字符串的
列表中

输入
对于测试用例的数量,输入从
T
开始。然后,在另一行出现
m
,询问要放入列表的字符串数
m
行要求相同长度的字符串,然后,最后一行由
start
end
组成,用空格分隔

例如:

List: ["booster", "rooster", "roaster", "coaster", "coasted"] 
start: roaster
end: booster

Number of String Transformation: 3 (roaster -> rooster -> booster)


List: ["booster", "rooster", "roaster", "coaster", "coasted"] 
start: booster
end: coasted

Number of String Transformation: 3 (booster -> rooster -> roaster -> coaster -> coasted)


List: ["booster", "rooster", "roaster", "coaster", "coasted", "coastal"] 
start: roaster
end: coastal

Number of String Transformation: impossible (roaster -> coaster -> coasted -> x -> coastal)
如果没有可能的方法,则输出
不可能
。否则,输出要变换的最短方法

我采用了一种递归方法,但这并不能找到所有可能的解决方案,因为它只会尝试更改与
end
字符串不相等的索引,从而跳过
列表中存在的可能导致可能的解决方案的一些字符串

我的代码适用于第一个示例,但忽略了第二个示例,因为它没有尝试
(助推器->公鸡->等)
,因为它只将
(助推器->库斯特->云霄飞车->云霄飞车)
视为可能的解决方案。我有点卡住了,我不知道如何解决这个问题。有人能告诉我一个更好的方法吗

def transformable(word_1, word_2):
    return len([i for i in range(len(word_1)) if word_1[i] != word_2[i]]) == 1

def shortest_transformation(start, end, words):
    queue = [[start]]
    available = set(words).difference({start})
    while queue:
        path = queue.pop()
        if transformable(path[-1], end):
            return path + [end]
        transformables = set(word for word in available if transformable(path[-1], word))
        queue = [path + [word] for word in transformables] + queue
        available = available.difference(transformables)
    return None

T = int(input())

for case in range(T):
    m = int(input())
    words = []
    for inputs in range(m):
        words.append(input())
    
    start, end = input().split()
    
    result = shortest_transformation(start, end, words)
    print(len(result)) if result else print("none")

4
5
booster
rooster
roaster
coaster
coastal
booster coastal
6
booster
rooster
roaster
coaster
coasted
coastal
booster coastal
5
booster
rooster
roaster
coaster
coasted
booster coasted
5
booster
rooster
roaster
coaster
coasted
roaster booster

Output:
none
none
5
3

如果您没有找到解决方案,这里有一个建议:

从集合导入数据
def可转换(字1、字2):
如果单词_1[i]!=word_2[i]==1,则返回len([i代表范围内的i(len(单词_1))
def\u转换(开始、结束、字):
队列=deque([[start]])
words=set(words).difference({start})
排队时:
path=queue.pop()
如果可转换(路径[-1],结束):
返回路径+[结束]
transformables=set(如果可转换,则以字对字(路径[-1],字))
queue.extendleft(路径+[word]表示可转换文件中的单词)
单词=单词。差异(可转换)
返回[]
这是一种广度优先搜索(使用的
.extendleft()
方法通过LILO/FIFO队列),这是一种搜索最短路径的好方法

请举个例子

words=[“助推器”、“公鸡”、“烤炉”、“杯垫”、“杯垫”]
开始=‘烘焙者’
结束=‘助推器’
打印(最短的_变换(开始、结束、字))
单词=[“助推器”、“公鸡”、“烤炉”、“杯垫”、“滑行”]
开始=‘助推器’
结束=‘滑行’
打印(最短的_变换(开始、结束、字))
单词=[“助推器”、“公鸡”、“烤炉”、“杯垫”、“滑行”、“海岸”]
开始=‘烘焙者’
结束=‘沿海’
打印(最短的_变换(开始、结束、字))
输出是

['roaster', 'rooster', 'booster']
['booster', 'rooster', 'roaster', 'coaster', 'coasted']
[]
如果您不想使用
deque
,那么这应该是等效的:

def shortest_transformation(start, end, words):
    queue = [[start]]
    available = set(words).difference({start})
    while queue:
        path = queue.pop()
        if transformable(path[-1], end):
            return path + [end]
        transformables = set(word for word in available if transformable(path[-1], word))
        queue = [path + [word] for word in transformables] + queue
        available = available.difference(transformables)
    return None

1) 你听说过最短路径问题吗?2) 你能找到最短路径问题和你的问题之间的关系吗?3) 你知道解决最短路径问题的算法吗?4) 你能从这个算法中启发自己写一个算法来解决你的问题吗?确切地说是哪一个?在我们的课堂上,我们仍然在讨论分治算法,这就是你所说的吗?不,我在讨论最短路径问题:在一个图中寻找两个顶点之间的最短路径。我不完全确定
T
到底做了什么,但你不应该缩进
结果…
打印吗(…
行通过
case
进入循环?没关系,我真的认为您的代码应该可以工作。唯一的问题是我们的编译器如何处理输入。无论如何,我真的非常感谢您的帮助。谢谢您的尝试!我尝试了这段代码,但我面临错误。@muw您能详细说明一下:什么类型的错误?它可以与预期的o一起工作吗utput如果我只是运行它,但当我试图逐行调试以了解您的方法时,它会给我以下错误:回溯(最近一次调用):文件“I:\Program Files\Thonny\lib\site packages\Thonny\workbench.py”,第1598行,在事件生成处理程序(事件)文件中“I:\Program Files\Thonny\lib\site packages\Thonny\plugins\debugger.py”,第1186行,在当前调试器中。handle\U debugger\u progress(msg)比这长得多,有很多错误,我无法确定原因。@muw在调试模式下工作得很好(PyCharm,在macOS和Windows10上)?我认为这是您的环境的一个限制,我不熟悉——不是编码错误。我添加了一个版本,它不使用
出列
,只是一个列表。也许它有帮助。再次尝试您的代码,它适用于我创建的测试用例,但对于我们的类编译器,它有三个隐藏的测试用例,它在运行时只通过了一个对于其他2个隐藏的案例,已经有了一个“代码> >索引错误< /代码>。这已经是一天了,我仍然无法在代码中找到漏洞。代码是否考虑多个路径,只输出最短路径?