Word Ladder I & II
Word Ladder I
Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the dictionary
Notice
- Return 0 if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]
As one shortest transformation is"hit" -> "hot" -> "dot" -> "dog" -> "cog", return its length 5.
分析:
BFS。但是下面这种发现现在通不过了,所以得想其它方法
 public class Solution {
     public int ladderLength(String start, String end, Set<String> dict) {
         if (diff(start, end) == ) return ;
         if (diff(start, end) == ) return ;
         ArrayList<String> inner = new ArrayList<String>();
         ArrayList<String> outer = new ArrayList<String>();
         inner.add(start);
         int counter = ;
         while (inner.size() != ) {
             counter++;
             if (dict.size() == ) return ;
             for (int i = ; i < inner.size(); i++) {
                 ArrayList<String> dicts = new ArrayList<String>(dict);
                 for (int j = ; j < dicts.size(); j++) {
                     if (diff(inner.get(i), dicts.get(j)) == ) {
                         outer.add(dicts.get(j));
                         dict.remove(dicts.get(j));
                     }
                 }
             }
             for (int k = ; k < outer.size(); k++) {
                 if (diff(outer.get(k), end) <= ) {
                     return counter + ;
                 }
             }
             ArrayList<String> temp = inner;
             inner = outer;
             outer = temp;
             outer.clear();
         }
         return ;
     }
     private int diff(String start, String end) {
         int total = ;
         for (int i = ; i < start.length(); i++) {
             if (start.charAt(i) != end.charAt(i)) {
                 total++;
             }
         }
         return total;
     }
 }
第二种方法:递归,复杂度更高。
 public class Solution {
     public static void main(String[] args) {
         Set<String> set = new HashSet<String>();
         set.add("hot");
         set.add("dot");
         set.add("dog");
         set.add("lot");
         set.add("log");
         Solution s = new Solution();
         System.out.println(s.ladderLength("hit", "cog", set));
     }
     public List<List<String>> ladderLength(String begin, String end, Set<String> set) {
         List<String> list = new ArrayList<String>();
         List<List<String>> listAll = new ArrayList<List<String>>();
         Set<String> used = new HashSet<String>();
         helper(begin, end, list, listAll, used, set);
         return listAll;
     }
     // find out all possible solutions
     public void helper(String current, String end, List<String> list, List<List<String>> listAll, Set<String> used,
             Set<String> set) {
         list.add(current);
         used.add(current);
         if (diff(current, end) == ) {
             ArrayList<String> temp = new ArrayList<String>(list);
             temp.add(end);
             listAll.add(temp);
         }
         for (String str : set) {
             if (!used.contains(str) && diff(current, str) == ) {
                 helper(str, end, list, listAll, used, set);
             }
         }
         list.remove(current);
         used.remove(current);
     }
     // return the # of letters difference
     public int diff(String word1, String word2) {
         int count = ;
         for (int i = ; i < word1.length(); i++) {
             if (word1.charAt(i) != word2.charAt(i)) {
                 count++;
             }
         }
         return count;
     }
 }
方法3
 class Solution {
     public int ladderLength(String begin, String end, List<String> list) {
         Set<String> set = new HashSet<>(list);
         if (!set.contains(end)) return ;
         Queue<String> queue = new LinkedList<>();
         int level = ;
         queue.add(begin);
         while (queue.size() != ) {
             level++;
             int size = queue.size();
             for (int k = ; k <= size; k++) {
                 String word = queue.poll();
                 char[] chs = word.toCharArray();
                 for (int i = ; i < chs.length; i++) {
                     char ch = chs[i];
                     for (char temp = 'a'; temp <= 'z'; temp++) {
                         chs[i] = temp;
                         String tempStr = new String(chs);
                         if (tempStr.equals(end)) return level + ;
                         if (set.contains(tempStr)) {
                             set.remove(tempStr);
                             queue.offer(tempStr);
                         }
                     }
                     chs[i] = ch;
                 }
             }
         }
         return ;
     }
 }
Word Ladder II
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that: 1) Only one letter can be changed at a time, 2) Each intermediate word must exist in the dictionary.
For example, given: start = "hit", end = "cog", and dict = ["hot","dot","dog","lot","log"], return:
[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
分析:
原理同上,按照层进行递进,当最外层到达end以后,我们就退出。
 class Solution {
     public List<List<String>> findLadders(String start, String end, List<String> dictList) {
         List<List<String>> result = new ArrayList<>();
         boolean hasFound = false;
         Set<String> dict = new HashSet<>(dictList);
         Set<String> visited = new HashSet<>();
         if (!dict.contains(end)) {
             return result;
         }
         Queue<Node> candidates = new LinkedList<>();
         candidates.offer(new Node(start, null));
         while (!candidates.isEmpty()) {
             int count = candidates.size();
             if (hasFound) return result;
             for (int k = ; k <= count; k++) {
                 Node node = candidates.poll();
                 String word = node.word;
                 char[] chs = word.toCharArray();
                 for (int i = ; i < chs.length; i++) {
                     char temp = chs[i];
                     for (char ch = 'a'; ch <= 'z'; ch++) {
                         chs[i] = ch;
                         String newStr = new String(chs);
                         if (dict.contains(newStr)) {
                             visited.add(newStr);
                             Node newNode = new Node(newStr, node);
                             candidates.add(newNode);
                             if (newStr.equals(end)) {
                                 hasFound = true;
                                 List<String> path = getPath(newNode);
                                 result.add(path);
                             }
                         }
                     }
                     chs[i] = temp;
                 }
             }
             dict.removeAll(visited);
         }
         return result;
     }
     private List<String> getPath(Node node) {
         List<String> list = new LinkedList<>();
         while (node != null) {
             list.add(, node.word);
             node = node.pre;
         }
         return list;
     }
 }
 class Node {
     String word;
     Node pre;
     public Node(String word, Node pre) {
         this.word = word;
         this.pre = pre;
     }
 }
Word Ladder I & II的更多相关文章
- LeetCode:Word Ladder I II
		其他LeetCode题目欢迎访问:LeetCode结题报告索引 LeetCode:Word Ladder Given two words (start and end), and a dictiona ... 
- 【leetcode】Word Ladder II
		Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation ... 
- 18. Word Ladder && Word Ladder II
		Word Ladder Given two words (start and end), and a dictionary, find the length of shortest transform ... 
- LeetCode :Word Ladder II  My Solution
		Word Ladder II Total Accepted: 11755 Total Submissions: 102776My Submissions Given two words (start ... 
- [leetcode]Word Ladder II @ Python
		[leetcode]Word Ladder II @ Python 原题地址:http://oj.leetcode.com/problems/word-ladder-ii/ 参考文献:http://b ... 
- LeetCode: Word Ladder II  解题报告
		Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation s ... 
- [Leetcode Week5]Word Ladder II
		Word Ladder II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/word-ladder-ii/description/ Descripti ... 
- 126. Word Ladder II(hard)
		126. Word Ladder II 题目 Given two words (beginWord and endWord), and a dictionary's word list, find a ... 
- leetcode 127. Word Ladder、126. Word Ladder II
		127. Word Ladder 这道题使用bfs来解决,每次将满足要求的变换单词加入队列中. wordSet用来记录当前词典中的单词,做一个单词变换生成一个新单词,都需要判断这个单词是否在词典中,不 ... 
随机推荐
- Robot Framework 的安装配置和简单的实例介绍
			Robot Framework 介绍 Robot Framework 是一款基于 Python 的功能自动化测试框架.它具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进 ... 
- 【模考】2018.04.08 Travel
			Description 有N个人出去旅行,第i个人去A国有Ai种游玩方式,去B国有Bi种游玩方式,问至少有C个人去A国的情况下,所有人的游玩方式有多少种不同的可能. 两种所有人的游玩方式不同当且仅当存 ... 
- 【CF710F】String Set Queries(二进制分组,AC自动机)
			[CF710F]String Set Queries(二进制分组,AC自动机) 题面 洛谷 CF 翻译: 你有一个字符集合\(D\),初始为空, 有三种操作: 往\(D\)中加入一个串:从\(D\)中 ... 
- Android Support WorkManager使用详解
			使用WorkManager调度任务 WorkManager是一个库, 用以将工作入队, 当该工作的约束条件得到满足之后, WorkManager保证它的执行. WorkManager允许观测工作的状态 ... 
- 【BZOJ4916】神犇和蒟蒻 解题报告
			[BZOJ4916]神犇和蒟蒻 Description 很久很久以前,有一群神犇叫sk和ypl和ssr和hjh和hgr和gjs和yay和xj和zwl和dcx和lyy和dtz和hy和xfz和myh和yw ... 
- 牛客网NOIP赛前集训营-普及组(第一场)
			前三题略 T4: 题目描述 小A有n个长度都是L的字符串.这些字符串只包含前8个小写字符,'a'~'h'.但这些字符串非常的混乱,它们几乎长得互不相同.小A想通过一些规则,让它们长得尽可能相同.小A现 ... 
- hihocoder #1162 矩阵加速dp
			#1162 : 骨牌覆盖问题·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 前两周里,我们讲解了2xN,3xN骨牌覆盖的问题,并且引入了两种不同的递推方法.这一次我 ... 
- Java入门:基础算法之计算三角形面积
			本部分介绍如何计算三角形面积. /** * @author: 理工云课堂 * @description: 程序计算三角形的面积.三角形的底和高由用户输入 */ import java.util.Sca ... 
- 使用traefik作为kubernetes的ingress
			目录 说明 部署 创建一个独立的命名空间 配置rbac授权 配置secret 创建一个configmap用于存放traefik的配置文件 配置traefik的deployment文件 配置服务 通过p ... 
- Docker应用四:搭建docker镜像仓库(包括自生成https证书、登陆认证)
			利用docker官网提供的registry镜像创建私有仓库 一.首先从docker官网拉取registry镜像: docker pull registry 二.然后运行该镜像: docker run ... 
