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:
- Only one letter can be changed at a time
- 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
- 【leetcode】Word Ladder II
- [LeetCode]Word Ladder II
- [leetcode] Word Ladder II
- LeetCode - Word Ladder II
- Leetcode: Word Ladder II
- leetcode Word Ladder II
- Leetcode Word Ladder II
- LeetCode | Word Ladder II
- leetcode word ladder II
- 【Leetcode】Word Ladder II
- [LeetCode] Word Ladder II
- Word Ladder II -- LeetCode
- Leetcode: Word Ladder II
- leetcode-Word Ladder II
- leetcode-Word Ladder II
- leetcode: Word Ladder II
- leetcode Word Ladder II
- Leetcode: Word Ladder II
- 现代操作系统——多处理机系统
- 绑定本地Service并与之通信
- iOS的花式进度条-五边形进度条,六边形进度条
- PXC中文文档--第四章
- SoundPool用于播放短小的音效
- LeetCode Word Ladder II
- GoshawkDB:一个分布式、支持事务与容错的对象存储
- iOS后台播放音乐
- jUnit 单元测试多线程失败
- 雷神之锤3源代码注释(1)
- Python基础9-10
- iOS开发中block的使用
- Linux服务器管理常用的命令
- 学习之路