LeetCode Word Ladder II

来源:互联网 发布:linux安装软件命令 编辑:程序博客网 时间:2024/05/16 09:47

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:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the word list

For example,

Given:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]


Solution:

这道题目的最大难点就是题目没有把数据范围说清楚……26^n,不知道n怎么可能确定用哪种存储方式……暴力都尝试一遍么也实在没有必要……

总之就是这道题目出的不好,路子诡异,因为我稍微改一下数据肯定就过不了

最后人肉wa了好几次大概猜出来是想让我们先BFS找到最短的层数,然后DFS找到所有可行的路径。

这样还AC不了,有很多小trick,因为做的意义不大,我就先放一个目前认为比较优雅的版本……先继续赶下面的题目


<span style="font-size:18px;">import java.util.*;public class Solution {TreeMap<String, LinkedList<String>> map;List<List<String>> list;HashSet<String> visited;public List<List<String>> findLadders(String beginWord, String endWord,Set<String> wordList) {list = new LinkedList<List<String>>();buildMap(beginWord, endWord, wordList);int level = BFS(beginWord, endWord, wordList);if (level == 0)return list;visited = new HashSet<String>();visited.add(beginWord);LinkedList<String> cur = new LinkedList<String>();cur.add(beginWord);DFS(0, level, cur, endWord);return list;}public void buildMap(String beginWord, String endWord, Set<String> wordList) {LinkedList<String> cur;int n = beginWord.length();String cur_str, neo_str;char[] cur_chars = new char[n];cur = new LinkedList<String>();cur.add(beginWord);map = new TreeMap<String, LinkedList<String>>();wordList.add(beginWord);for (Iterator<String> ite = wordList.iterator(); ite.hasNext();) {cur_str = ite.next();LinkedList<String> cur_list = new LinkedList<String>();cur_chars = cur_str.toCharArray();for (int j = 0; j < n; j++) {char initial = cur_chars[j];for (int c = 'a'; c <= 'z'; c++) {if (cur_chars[j] == c)continue;cur_chars[j] = (char) c;neo_str = new String(cur_chars);if (wordList.contains(neo_str) || neo_str.equals(endWord))cur_list.add(neo_str);cur_chars[j] = initial;}}map.put(cur_str, cur_list);}wordList.remove(beginWord);}public int BFS(String beginWord, String endWord, Set<String> wordList) {LinkedList<LinkedList<String>> queue = new LinkedList<LinkedList<String>>();LinkedList<String> cur, neo;String cur_str, neo_str;cur = new LinkedList<String>();cur.add(beginWord);queue.add(cur);int step = 0;while (!queue.isEmpty()) {int size = queue.size();step++;for (int i = 0; i < size; i++) {cur = queue.poll();cur_str = cur.get(cur.size() - 1);LinkedList<String> nextLevel = map.get(cur_str);for (Iterator<String> ite = nextLevel.iterator(); ite.hasNext();) {neo_str = ite.next();if (cur.contains(neo_str))continue;neo = new LinkedList<String>(cur);neo.add(neo_str);wordList.remove(neo_str);if (neo_str.equals(endWord))return step + 1;queue.add(neo);}}}return step;}public void DFS(int currentLevel, int targetLevel,LinkedList<String> currentList, String endWord) {if (currentLevel == targetLevel) {if (currentList.get(currentLevel).equals(endWord))list.add(new LinkedList<String>(currentList));return;}if (visited.contains(endWord))return;String cur = currentList.get(currentLevel);LinkedList<String> nextLevel = map.get(cur);String next;for (Iterator<String> ite = nextLevel.iterator(); ite.hasNext();) {next = ite.next();if (visited.contains(next))continue;visited.add(next);currentList.add(next);DFS(currentLevel + 1, targetLevel, currentList, endWord);currentList.remove(next);visited.remove(next);}}}</span>


0 0