雙向繫結之Javascript
阿新 • • 發佈:2021-06-16
127. 單詞接龍
字典wordList
中從單詞beginWord
和endWord
的轉換序列是一個按下述規格形成的序列:
- 序列中第一個單詞是
beginWord
。 - 序列中最後一個單詞是
endWord
。 - 每次轉換隻能改變一個字母。
- 轉換過程中的中間單詞必須是字典
wordList
中的單詞。
給你兩個單詞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
中的所有字串互不相同
思路1:bfs
參考:https://www.cnblogs.com/qiu-yu/p/14929599.html
與參考連結思路相似,需要構造狀態轉換表,再次bfs
class Solution { public int ladderLength(String beginWord, String endWord, List<String> wordList) { Map<String, List<String>> map = new HashMap<>(); wordList.add(beginWord);for (String word: wordList) { map.put(word, new ArrayList<>()); } for (int i=0; i<wordList.size(); i++) { String k1 = wordList.get(i); for (int j=i+1; j<wordList.size(); j++) { String k2 = wordList.get(j); if (connect(k1, k2)) { List<String> list1 = map.get(k1); list1.add(k2); map.put(k1, list1); List<String> list2 = map.get(k2); list2.add(k1); map.put(k2, list2); } } } Queue<String> q = new LinkedList<>(); q.offer(beginWord); Set<String> seen = new HashSet<>(); seen.add(beginWord); int step = 1; while (!q.isEmpty()) { step++; int size = q.size(); for (int i=0; i<size; i++) { String status = q.poll(); for (String nextStatus: map.get(status)) { if (endWord.equals(nextStatus)) { return step; } if (!seen.contains(nextStatus)) { q.offer(nextStatus); seen.add(nextStatus); } } } } return 0; } private boolean connect(String word1, String word2) { int cnt = 0; for (int i=0; i<word1.length(); i++) { if (word1.charAt(i) != word2.charAt(i)) cnt++; } return cnt == 1; } }