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

单词接龙

2020年11月5日

题目来源:力扣

LeetCode—每日一题:单词接龙(BFS)_第1张图片
LeetCode—每日一题:单词接龙(BFS)_第2张图片

解题
一开始使用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;
    }
}

LeetCode—每日一题:单词接龙(BFS)_第3张图片

你可能感兴趣的:(LeetCode)