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;
    }
}

 

 

 

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