LeetCode—每日一题:单词接龙(BFS)

单词接龙

2020年11月5日

题目来源:力扣

在这里插入图片描述
在这里插入图片描述

解题
一开始使用DFS进行深度遍历,发现进进出出的太花时间,且做出来之后超时了。

改用BFS进行遍历,逐层进行搜索,这里是一个图的结构了,且是双向图

思路来自

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
       //广度遍历
       //先把列表转成集合
       Set<String> wordSet=new HashSet<>(wordList);
       //走过的字符串集合
       Set<String> visited=new HashSet<>();
       //建立一个队列,做广度遍历
       Queue<String> queue=new LinkedList<>();
       queue.add(beginWord);
       //单词字符串长度
       int wordLen=beginWord.length();
       //初始步数
       int step=1;

       while(!queue.isEmpty()){
           int len=queue.size();
           //一个个拿出队列中现有的字符串,逐层往后推
           for(int i=0;i<len;i++){
               //转成字符串数组
               char[] tmp=queue.poll().toCharArray();
               //改动字符串的每一位字符
               for(int j=0;j<wordLen;j++){
                   //先记录下原字符
                   char beforeCh=tmp[j];
                   for(char z='a';z<='z';z++){
                       //如果与当前字符相等,跳过
                       if(beforeCh==z) continue;
                       //不相同就进行比较
                       tmp[j]=z;
                       //把字符串数组转成字符串
                       String tmpString=String.valueOf(tmp);
                       //看看哈希集合里有没有,也看看有没有遍历过
                       if(wordSet.contains(tmpString) && !visited.contains(tmpString)){
                            //看看跟最终字符串是不是一样的
                            if(tmpString.equals(endWord)){
                                return step+1;
                            }
                           queue.add(tmpString);
                           visited.add(tmpString);
                       }
                   }
                   //改回去
                   tmp[j]=beforeCh;
               }
           }
           step++;
       }
       return 0;
    }
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值