python语言单词接龙_双向BFS的实现 力扣 《单词接龙》 Java与Python版本

127.单词接龙·

给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

每次转换只能改变一个字母。

转换过程中的中间单词必须是字典中的单词。

说明:

如果不存在这样的转换序列,返回 0。

所有单词具有相同的长度。

所有单词只由小写字母组成。

字典中不存在重复的单词。

你可以假设 beginWord 和 endWord 是非空的,且二者不相同。

示例 1:

输入:

beginWord = “hit”,

endWord = “cog”,

wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]

输出: 5

解释: 一个最短转换序列是 “hit” -> “hot” -> “dot” -> “dog” -> “cog”,

返回它的长度 5。

示例 2:

输入:

beginWord = “hit”

endWord = “cog”

wordList = [“hot”,“dot”,“dog”,“lot”,“log”]

输出: 0

解释: endWord “cog” 不在字典中,所以无法进行转换。

通过次数36,308提交次数87,695

解决方案一:(Java版本)

// Two-ended BFS Java

import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

class Solution {

public int ladderLength(String beginWord, String endWord, ListwordList__) {//函数入口

SetwordList = new HashSet(wordList__);//把list换成hash表,便于后边查这个单词是否在wordlist里面,更加的快捷,查询一个单词是否在list里面存在,时间复杂度为O(n),hashset时间复杂度为o(1)

SetbeginSet = new HashSet(), endSet = new HashSet();//从beginword向外扩散出来的set ,endset就是从engword向外扩散的

int len = 1;

int strLen = beginWord.length();

HashSetvisited = new HashSet();//visited指的是你BFS的结点是否已经被访问过了,向外边扩散时,扩散到中间的时候,这个结点你不能让它再往回走,所以visited

beginSet.add(beginWord);

endSet.add(endWord);//然后就把beginset和endset,分别加上起始的单词就行了

//BFS starts here

while (!beginSet.isEmpty() && !endSet.isEmpty()){//当两个queue都不为空时,说明已经搜索完了,因为是双向BFS,所以这里就有两个queue,就是两个set

if(beginSet.size() > endSet.size()){//因为每次扩散,只扩散其中一个,所以优先选择小的set,所以如果beginset更小的话,首先扩散beginset就行了,如果beginset大,就把beginset和endset互换一下

Setset = beginSet;

beginSet = endSet;//互换两个set

endSet = set;

}

Settemp = new HashSet();//temp表接下来要扩散出来的

for(String word : beginSet){//每次扩散,扩散beginset就行了,前面已保证了需要的情况下我们会置换一下,这里就为扩散beginset,就是循环set里边的所有单词Word,对每一个单词变换其中一个字符位

char[] chs = word.toCharArray();

for(int i=0;i

解决方案二:(Python版本)

impot string

class Solution(object):

def ladderLength(self, beginWord, endWord, wordList):#函数的入口

if endWord not in wordList : return 0 #如果endword没在wordlist里面,直接return0

front = {beginWord}

back = {endWord}

dest = 1 #走的步数,最开始的时候把它记为1,因为最开始就是一步

wordList = set(wordList)#wordlist从新定义一个set,这样方便查找

word_len = len(beginWord)#然后把beginword搞一个wordlength,先存起来

#BFS start here

while front:

dist += 1#每次走之前dist+1

next_front = set()#然后把next_front就是之前Java code里面temp,先设置一下set,后面扩散出来的点,要放到next_front里面去

for word in front:#把front里边的单词全部遍历一次,

for i in rang(word_len):#遍历单词的每一个字符位

for c in string.lowercase:#把这个字符位取出来之后,遍历从‘a’遍历到字符'z'里面去

if c != word[i]:#每次把i这个位置换掉

new_word = word[:i]+c+word[i+1:]#把第i个位置换成新的字符c,就是把i之前的位置不变,i+1和i+1之后的这些字符也不变,中间的i下标的位置换成c字符,这样就得到一个newword

if new_word in back:#如果newword在back中,说明相交了

return dist#然后distance就可以返回了

#不然就进行扩散

if new_word in wordList:#判断newword是否在wordlist里面,如果不在说明扩散出来new_word的话,它不是一个合法的,在这个单词列表里面的单词我们就不考虑了

next_front.add(new_word)#如果在的话就把newword加到nextfront里边去

wordList.remove(new_word)#同时把newword从wordlist里面撤掉

front = next_front#然后再把nextfront赋给front,因为一开始是空,然后逐渐把下一层要扩散的单词纷纷地放到nextfront里边去,当它把front里面全部处理完了,说明nextfront的话,就已经准备好了要给新的front了

if len(back)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单词接龙是一个游戏,旨在通过更改一个字母来逐步转换一个单词成为另一个指定的单词。规则包括: 1. 可用于接龙单词首字母必须与前一个单词的尾字母相同。 2. 当存在多个首字母相同的单词时,取长度最长的单词。如果长度也相等,则取词典序最小的单词。 3. 已经参与接龙单词不能重复使用。 对于给定的一组由小写字母组成的单词数组和指定的起始单词和结束单词,我们需要进行单词接龙,并输出最长的单词串,其中单词串是由单词拼接而成,中间没有空格。如果不存在这样的转换序列,则返回0。 例如,对于输入的例子 beginWord = "hit",endWord = "cog",wordList = ["hot", "dot", "dog", "lot", "log"],我们可以进行以下单词接龙序列: "hit" -> "hot" -> "dot" -> "dog" -> "cog"。在这个例子中,最长的单词串为"hit" -> "hot" -> "dot" -> "dog" -> "cog"。 请注意,以上例子只是为了说明单词接龙的概念和规则,并不是针对Python编程的具体实现。具体的实现方法可以使用广度优先搜索 (BFS) 或双向BFS等算法来解决。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python题目55:单词接龙](https://blog.csdn.net/m0_60741207/article/details/121528418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [127. 单词接龙Python)](https://blog.csdn.net/JulyLi2019/article/details/106610034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值