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"]

Return

  [
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]

Note:

  • All words have the same length.
  • All words contain only lowercase alphabetic characters.

从start变换到end,途中只能经过字典中的单词,每次只允许差一个字母。
要求输出所有最短变换路径。

这里刚开始使用了最普通的方法,即利用DFS,超时了。

public class Solution {

    List list = new ArrayList<List>();
int num = 0;
String[] words;
String[] ans;
public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) { if( beginWord.length() == 0 || wordList.size() == 0 )
return list;
int len = wordList.size();
words = new String[len];
int i = 0;
for( String str : wordList ){
words[i] = str;
i++;
}
ans = new String[len+2];
ans[0] = beginWord; helper(beginWord,endWord,1);
return list; } public void helper(String beginWord,String endWord,int pos){ if( OneDiff(beginWord,endWord)){
if( num == 0 )
num = pos;
else if( num < pos )
return;
else if( num > pos ){
list.clear();
num = pos;
}
List ll = new ArrayList<String>();
for( int i = 0;i<pos;i++)
ll.add(ans[i]);
ll.add(endWord);
list.add(ll);
return ;
} for( int i = 0;i<words.length;i++){
String str = words[i];
if( str == "-1")
continue;
if( OneDiff(beginWord,str) ){
ans[pos] = str;
words[i] = "-1";
helper(str,endWord,pos+1);
words[i] = str;
}
} } public boolean OneDiff(String word1,String word2){
int flag = 0;
for( int i = 0;i<word1.length();i++){ if( word1.charAt(i) == word2.charAt(i) )
continue;
else{
if( flag == 0)
flag =1;
else
return false;
} }
return true;
}
}
}

2、使用BFS,仍旧超时了。

public class Solution {

    List list = new ArrayList<List>();
Queue queue;
HashMap map = new HashMap<String,Integer>(); public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) { if( beginWord.length() == 0 || wordList.size() == 0 )
return list;
queue = new LinkedList<ArrayList<String>>();
if( OneDiff(beginWord,endWord) ){
List ll = new ArrayList<String>();
ll.add(beginWord);
ll.add(endWord);
list.add(ll);
return list;
}
List ll = new ArrayList<String>();
ll.add(beginWord);
int flag = 0;
int deep = 0;
map.put(beginWord,deep);
queue.add(ll);
while( !queue.isEmpty() ){
deep++;
int len = queue.size();
for( int i = 0;i<len;i++) {
List l1 = (List) queue.poll();
String s1 = (String) l1.get(l1.size() - 1);
for (String str : wordList) {
if (OneDiff(s1, str) && ( !map.containsKey(str) || (int)map.get(str) == deep) ) {
map.put(str,deep);
List l2 = new ArrayList<String>();
l2.addAll(l1);
l2.add(str);
queue.add(l2);
if (OneDiff(str, endWord)) {
l2.add(endWord);
// for (int ii = 0; ii < l2.size(); ii++)
// System.out.print(l2.get(ii) + " ");
// System.out.println();
list.add(l2);
flag = 1;
}
}
}
}
if( flag == 1)
queue.clear();
}
return list; }
public boolean OneDiff(String word1,String word2){
int flag = 0;
for( int i = 0;i<word1.length();i++){ if( word1.charAt(i) == word2.charAt(i) )
continue;
else{
if( flag == 0)
flag++;
else
return false;
} }
if( flag == 1)
return true;
else
return false;
}
}

3、借鉴了他人的答案

优化方法:先BFS生成找到end时的生成树,标记出每个单词所在的层数。然后从目标用DFS往回找,过了大数据。

NOTE:我在代码中刚开始由于存在static,导致测试用例一直无法通过。

public class Solution {

    List list = new ArrayList<List>();
HashMap map = new HashMap<String,Integer>(); public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) { if( beginWord == null || beginWord.length() == 0 || wordList.size() == 0 || beginWord.length() != endWord.length() )
return list; BFS(beginWord,endWord,wordList);
if( map.size()== 1 )
return list;
DFS(endWord,beginWord,new ArrayList<String>()); return list; }
public void DFS(String beginWord,String endWord,List ans){ if( beginWord.equals(endWord) ){
ans.add(beginWord);
Collections.reverse(ans);
list.add(ans);
return ;
}
if( map.get(beginWord) == null )
return ;
ans.add(beginWord);
int deep = (int) map.get(beginWord)-1;
for( int i = 0;i<beginWord.length();i++){
char[] word = beginWord.toCharArray();
for( char ch = 'a';ch<='z';ch++) {
word[i] = ch;
String nWord = new String(word);
if ( map.get(nWord) != null && ((int) map.get(nWord) == deep)) {
ArrayList ll = new ArrayList<String>(ans);
DFS(nWord, endWord, ll); }
}
}
}
public void BFS(String beginWord,String endWord,Set<String> wordList){ Queue queue = new LinkedList<String>();
queue.add(beginWord);
map.put(beginWord,0);
while( !queue.isEmpty() ){
String str = (String) queue.poll();
if( str.equals(endWord) )
continue;
for( int i = 0 ;i <beginWord.length();i++){
char[] word = str.toCharArray();
for( char ch = 'a';ch<='z';ch++) {
word[i] = ch;
String Nword = new String(word);
if ( Nword.equals(endWord) || wordList.contains(Nword)) {
if (!map.containsKey(Nword)) {
map.put(Nword, (int) map.get(str) + 1);
queue.add(Nword);
}
}
}
}
}
} }

leetcode 126. Word Ladder II ----- java的更多相关文章

  1. Java for LeetCode 126 Word Ladder II 【HARD】

    Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...

  2. LeetCode 126. Word Ladder II 单词接龙 II(C++/Java)

    题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ...

  3. [LeetCode] 126. Word Ladder II 词语阶梯 II

    Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...

  4. [LeetCode] 126. Word Ladder II 词语阶梯之二

    Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...

  5. Leetcode#126 Word Ladder II

    原题地址 既然是求最短路径,可以考虑动归或广搜.这道题对字典直接进行动归是不现实的,因为字典里的单词非常多.只能选择广搜了. 思路也非常直观,从start或end开始,不断加入所有可到达的单词,直到最 ...

  6. leetcode@ [126] Word Ladder II (BFS + 层次遍历 + DFS)

    https://leetcode.com/problems/word-ladder-ii/ Given two words (beginWord and endWord), and a diction ...

  7. leetcode 127. Word Ladder、126. Word Ladder II

    127. Word Ladder 这道题使用bfs来解决,每次将满足要求的变换单词加入队列中. wordSet用来记录当前词典中的单词,做一个单词变换生成一个新单词,都需要判断这个单词是否在词典中,不 ...

  8. 126. Word Ladder II(hard)

    126. Word Ladder II 题目 Given two words (beginWord and endWord), and a dictionary's word list, find a ...

  9. [Leetcode Week5]Word Ladder II

    Word Ladder II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/word-ladder-ii/description/ Descripti ...

随机推荐

  1. svn cleanup failed问题解决

    1.SVN出错 今早过来Update,报如下错误: 再次更新,svn会要求你执行clean up,但执行clean up仍会报错,说有未完的work item,还要求你执行clean up.汗,陷入死 ...

  2. EntityFramework查询oracle数据库时报ora-12704: character set mismatch

    1.这段linq,执行期间报ora-12704:character set mismatch错误. var query = from m in ctx.MENU where (m.SUPER_MENU ...

  3. Servlet下

    HTTP简介 HTTP是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...

  4. 面试题目-c和c++的区别

    在很大程度上,标准C++是标准C的超集.实际上,所有C程序也是C++程序,然而,两者之间有少量区别.下面简要介绍一下最重要的区别.    1. 在C++中,局部变量可以在一个程序块内在任何地方声明,在 ...

  5. Android 获取网络状态

    1.检测网络是否可用 public boolean isNetWorkConnected() { ConnectivityManager cm = (ConnectivityManager)getSy ...

  6. ModuleWorks免费下载使用方法大全

    ModuleWorks为模拟机器的工具运转及(或)机床和车床材料的搬运提供了一整套解决方案. 模拟技术可以识别潜在的碰撞问题,允许在NC代码生成前进行除错检查,并且渐渐成为CAM处理方面必不可少的解决 ...

  7. java基础之hashmap

    Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论. 1.hashma ...

  8. Oracle Data Integrator与OWB的集成及迁移

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  9. Javascript之clipBoard操作

    1.clipBoard 是网页上剪贴板,可以获取剪切板上值,可能类似物键-值对这种模式取值\赋值,如果在copy网上的某篇博客时,往往会带有“转载自xxxx地方 http://www.xxx.com/ ...

  10. 12-27cell常用的属性

    1.创建cell //    创建一个cell并且设置cell的风格 UITableViewCell *cell  = [[UITableViewCell alloc]initWithStyle:UI ...