127. 单词接龙

116 篇文章 0 订阅

问题
在这里插入图片描述

例子

在这里插入图片描述

思路
wordList中可以没有beginWord,但是要有endWord
问题抽象为无向无权图,单词为结点,差一个字母的单词之间连边。问题变成找到从起点到终点的最短路径,如果存在的话。因此可以使用广度优先搜索方法。
在这里插入图片描述
在这里插入图片描述
递归深度遍历,超时
所以考虑采用广度遍历

  • 方法1

  • 方法2

代码

//方法1 我的dfs 超时
class Solution {
    private int res = Integer.MAX_VALUE;
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        if(!wordList.contains(endWord)) return 0;
        boolean[] used = new boolean[wordList.size()];
  
        //因为还有beginWord没有算上
        backtrack(wordList,endWord,used,beginWord,1);
        return res==Integer.MAX_VALUE?0:res;
       

    }

    public void backtrack(List<String> wordList, String endWord, boolean[] used, String now, int len) {
      
        if(now.equals(endWord)) {
            res = Math.min(res,len);
            return;
        }
        
        for(int i=0; i<wordList.size(); i++) {
            if(used[i]==true) continue;
            else if(check(wordList.get(i),now)){
                used[i]=true;
                backtrack(wordList,endWord,used,wordList.get(i),len+1);

                used[i]=false;

            }
        }
    
    }
    
    public boolean check(String a, String b) {
        int dist=0;
        for(int i=0; i<a.length(); i++) {
            if(a.charAt(i)!=b.charAt(i)) {
            	dist++;
            	if(dist>1) return false;
            }            	
        }
        return dist==1;
    }
}
   
//方法2
class Solution {

    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        if(!wordList.contains(endWord)) return 0;
        boolean[] used = new boolean[wordList.size()];
        int level = 0;
  
        Queue<String> q = new LinkedList<>();
        int index = wordList.indexOf(beginWord);
        if(index>-1) used[index]=true;
        q.offer(beginWord);
        while(q.size()>0) {
            
            level++;
            int len = q.size();
            for(int i=0; i<len; i++) {
                String now = q.poll();
                for(int j=0; j<wordList.size(); j++) {
                    
                    //先把错误的都去掉
                    if(used[j]==true) continue;
                    String next = wordList.get(j);
                    if(dist(now, next)==false) continue;

                    if(next.equals(endWord)) return level+1;

                    used[j]=true;
                    q.offer(next);

                }
                
            }
        }
        return 0;

    }

    //距离是否为1
    public boolean dist(String a, String b) {
        int dist=0;
        for(int i=0; i<a.length(); i++) {
            if(a.charAt(i)!=b.charAt(i)) {
                dist++;
                if(dist>1) return false;
            }
        }
        return dist==1;
    }
}
单词接龙是一个游戏,旨在通过更改一个字母来逐步转换一个单词成为另一个指定的单词。规则包括: 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、付费专栏及课程。

余额充值