Word Ladder2
题目地址:
https://leetcode.com/problems/word-ladder-ii/description/
题目:
解题思路:
这道题用bfs来解。
代码:
https://leetcode.com/problems/word-ladder-ii/description/
题目:
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord to endWord, such that:
- Only one letter can be changed at a time
- Each transformed word must exist in the word list. Note that beginWord is not a transformed word.
For example,
Given:
beginWord =
endWord =
wordList =
beginWord =
"hit"endWord =
"cog"wordList =
["hot","dot","dog","lot","log","cog"]
Return
[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
解题思路:
这道题用bfs来解。
代码:
public class WordLadder2 { /* Given: beginWord = "hit" endWord = "cog" wordList = ["hot","dot","dog","lot","log","cog"] Return [ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ] */ public static void main(String[] args){ WordLadder2 wordLadder2 = new WordLadder2(); String beginWord = "hit"; String endWord = "cog"; List<String> wordList = new ArrayList(); wordList.add("hot"); wordList.add("dot"); wordList.add("dog"); wordList.add("lot"); wordList.add("log"); wordList.add("cog"); List<List<String>> rst = wordLadder2.findLadders(beginWord, endWord, wordList); System.out.println(rst); } public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) { List<List<String>> rst = new ArrayList<>(); List<String> list = new ArrayList<>(); Map<String, List<String>> map = buildMap(wordList, beginWord); Deque<String> q = new LinkedList<>(); q.offer(beginWord); Set<String> visited = new HashSet<>(); visited.add(beginWord); list.add(beginWord); Deque<List<String>> paths = new LinkedList<>(); boolean done = false; // count how many level we have int count = 0; while(q.size() != 0 && !done){ int size = q.size(); count++; for(int i = 0; i <= size - 1; i++){ String curr = q.poll(); // add to visited visited.add(curr); List<String> level = map.get(curr); List<String> temp = paths.poll(); for(int j = 0; j <= level.size() - 1; j++){ if(visited.contains(level.get(j))){ continue; } if(level.get(j).equals(endWord)){ done = true; } List<String> tempPath = new ArrayList<>(temp); tempPath.add(level.get(j)); paths.offer(tempPath); q.offer(level.get(j)); // remove unneccesary part if(map.get(level.get(j)).contains(curr)){ map.get(level.get(j)).remove(curr); } } } } while(paths.size() != 0){ List<String> curr = paths.poll(); if(curr.size() == count + 1 && curr.get(curr.size() - 1).equals(endWord)){ rst.add(curr); } } return rst; } private Map<String,List<String>> buildMap(List<String> wordList, String beginWord) { String curr = beginWord; Map<String, List<String>> graph = new HashMap<>(); graph.put(curr, new ArrayList<>()); for(int i = -1; i <= wordList.size() - 1; i++){ // new a arraylist for that string if(i != -1){ curr = wordList.get(i); graph.put(curr, new ArrayList<>()); } for(int j = 0; j <= wordList.size() - 1; j++){ String other = wordList.get(j); if(curr.equals(other)){ continue; } else{ if(isNext(curr, other)){ graph.get(curr).add(other); } } } } return graph; } private boolean isNext(String curr, String other) { int i = 0; int rst = 0; while(i <= curr.length() - 1){ if(curr.charAt(i) != other.charAt(i)){ rst++; } if(rst >= 2){ return false; } i++; } return true; } }

Comments
Post a Comment