题目地址(127. 单词接龙)

Posted 潜行前行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题目地址(127. 单词接龙)相关的知识,希望对你有一定的参考价值。

题目地址(127. 单词接龙)

https://leetcode.cn/problems/word-ladder/

题目描述

字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk:

每一对相邻的单词只差一个字母。
 对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
sk == endWord

给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。

 

示例 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" 不在字典中,所以无法进行转换。

 

提示:

1 <= beginWord.length <= 10
endWord.length == beginWord.length
1 <= wordList.length <= 5000
wordList[i].length == beginWord.length
beginWord、endWord 和 wordList[i] 由小写英文字母组成
beginWord != endWord
wordList 中的所有字符串 互不相同

关键点

  • 深度遍历,加记忆化

代码

  • 语言支持:Java

Java Code:


class Solution 
    public int ladderLength(String beginWord, String endWord, List<String> wordList) 
        int end = wordList.indexOf(endWord);
        if(end==-1)
            return 0;
        
        wordList.add(beginWord);
        int start = wordList.size()-1;
        Queue<Integer> sQueue = new LinkedList<>();
        Queue<Integer> eQueue = new LinkedList<>();
        Set<Integer> sVisited = new HashSet<>();
        Set<Integer> eVisited = new HashSet<>();
        sVisited.add(start);
        sQueue.add(start);
        eVisited.add(end);
        eQueue.add(end);
        
        int count = 0;
        while(!sQueue.isEmpty() && !eQueue.isEmpty() )
            if(sQueue.size() > eQueue.size() )
                Queue<Integer> t = sQueue;
                sQueue = eQueue;
                eQueue = t;
                Set<Integer> s = sVisited;
                sVisited = eVisited;
                eVisited = s;
            
            int size = sQueue.size();
            count++;
            while(size-- > 0)
                String str = wordList.get(sQueue.poll());
                for(int i=0;i<wordList.size();i++)
                    if(sVisited.contains(i)) continue;
                    if(!canChange(str,wordList.get(i))) continue;
                    if(eVisited.contains(i)) return count+1; // 需要进行最后一次转换 
                    sVisited.add(i);
                    sQueue.add(i);
                
            
        
        return 0;
    

    public boolean canChange(String s,String p)
        int count = 0;
        if(s.length() == p.length())
            for(int i=0;i<s.length();i++)
                if(s.charAt(i) != p.charAt(i))
                    if(++count > 1) return false;
                
             
        
        return count == 1;
    


以上是关于题目地址(127. 单词接龙)的主要内容,如果未能解决你的问题,请参考以下文章

127. 单词接龙

单词接龙(力扣第127题)

Leetcode No.127 单词接龙(BFS)

Leetcode No.127 单词接龙(BFS)

leetcode 127 单词接龙

LeetCode 127. 单词接龙