127. 单词接龙

本文探讨了在单词列表中寻找从开始单词到结束单词的最短转换路径问题,通过构建无向图并运用广度优先搜索算法解决。讨论了两种实现方法,包括深度优先搜索的递归实现和广度优先搜索的队列实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题
在这里插入图片描述

例子

在这里插入图片描述

思路
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值