就是給一個單詞詞典,給一個開始詞彙和結束詞彙,在詞典中找出開始詞彙轉變成結束詞彙的過程,求轉變次數
每次只能轉變單詞的一個字符
可能會有多條路徑可以到達,搜索問題可以用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;
}
}