1. 程式人生 > 其它 >雙向繫結之Javascript

雙向繫結之Javascript

127. 單詞接龍

字典wordList中從單詞beginWordendWord的轉換序列是一個按下述規格形成的序列:

  • 序列中第一個單詞是beginWord
  • 序列中最後一個單詞是endWord
  • 每次轉換隻能改變一個字母。
  • 轉換過程中的中間單詞必須是字典wordList中的單詞。

給你兩個單詞beginWordendWord和一個字典wordList,找到從beginWordendWord的最短轉換序列中的單詞數目。如果不存在這樣的轉換序列,返回 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
  • beginWordendWordwordList[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; } }