leetcode 127 单词接龙(搜索 java)

 就是给一个单词词典,给一个开始词汇和结束词汇,在词典中找出开始词汇转变成结束词汇的过程,求转变次数

每次只能转变单词的一个字符

 

 

 可能会有多条路径可以到达,搜索问题可以用DFS BFS解决,DFS更适合搜索有多少条路径,BFS更适合搜索最小深度

所以这个题最好是用BFS

图的深度优先搜索:一个节点从他能够到达的未走过的节点中选择一个遍历,然后继续往后

图的宽度优先遍历:就是节点分层,可能有多条路径可能走到最后,但我们只关注走了几层

其实我们很容易就想到,接下来应该做的是怎么表示单词之间的转换,可以用邻接表或者邻接矩阵

因为不知道顶点的规模和个数,我们我们此时按照邻接表去做比较合适

 

这个地方要注意一下,beginword不一定已经存在在wordlist里面,所以要先放进去

我其实看网上,很多都是用hashset或者queue还有map来实现,没有去创建邻接矩阵或者邻接表 

所以先创建图再去遍历图,有些复杂了,我们借助队列来进行广度优先遍历

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        Queue<String>q = new LinkedList<String>();
        q.add(beginWord);//先将初始节点加进去
        int steps=0;
        while(!q.isEmpty()){
            int sizeQ=q.size();
            for(int i=0;i<sizeQ;i++){//遍历当前层的节点
                String temp=q.poll();
                if(temp.equals(endWord)){
                    return steps+1;
                }
                Iterator<String> it =wordList.iterator();
                while(it.hasNext()){
                    String current = it.next();
                    //队列中的头和list表中的当前遍历值可以转换
                    if(canTransform(temp,current)){
                        q.offer(current);
                        //使用集合对象 all 的 remove() 方法后,迭代器的结构被破坏了,遍历停止了
                        //wordList.remove(current);
                        it.remove();
                    }
                }
            }
            steps++;
        }
        return 0;
    }
    //比较两个单词是否可以转换,也就是只有一位不同
    boolean canTransform(String word1, String word2){
        int cnt=0;//记录word1 word2不相等字符个数
        for(int i=0;i<word1.length();i++){
            if(word1.charAt(i)!=word2.charAt(i)){
                cnt++;
            }
        }
        return cnt==1;
    }
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章