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个隐藏的案例,已经有了一个“代码> >索引错误< /代码>。这已经是一天了,我仍然无法在代码中找到漏洞。代码是否考虑多个路径,只输出最短路径?