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用来记录当前词典中的单词,做一个单词变换生成一个新单词,都需要判断这个单词是否在词典中,不 ...
随机推荐
- django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除
运维使用docker部署好之后FastDFS分布式文件系统之后,提供给我接口如下: fastdfs tracker 192.168.1.216 192.168.1.217 storage 192.16 ...
- Mininet 系列实验(四)
实验内容 本次实验拓扑图: 在该环境下,h0 向 h1 发送数据包,由于在 mininet 脚本中设置了连接损耗率,在传输过程中会丢失一些包,本次实验的目的是展示如何通过控制器计算路径损耗速率(h0- ...
- 【BZOJ1801】【Ahoi2009】chess 中国象棋
Time Limit: 10 Sec Memory Limit: 64 MB Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方 ...
- BZOJ1113 [Poi2008]海报PLA 【分治 + 线段树】
题目链接 BZOJ1113 题解 显然只与高有关,每次选择所有海报中最低的覆盖所有海报,然后分治两边 每个位置会被调用一次,复杂度\(O(nlogn)\) \(upd:\)智障了,,是一道\(O(n) ...
- #define后面只带有一个标识符
经常看到有#define后只有一个标识符的语句,这样是做宏开关用 宏定义编译前会被编译器进行替换,只有一个标识符的情况,如果在代码里使用了这个标识符,会被替换为空,也就是相当于没加. 用来做编译开关的 ...
- JS的强制类型转换
将值从一种类型转换为另一种类型通常称为类型转换,这是显式的情况,隐式的情况称为强制类型转换. JavaScript中的强制类型转换总是返回标量基本类型值,如字符串.数字和布尔值,不会返回对象和函数. ...
- Button 或 ImageButton 背景设为 透明 或半透明 (转)
半透明<Button android:background="#e0000000" ... /> 透明<Button android:background=&qu ...
- 移动端图片轮播—swipe滑动插件
swipe是一个轻量级的移动滑动组件,它可以支持精确的触滑移动操作,能解决移动端对滑动的需求. swipe插件的使用主要有四大块: 一.html <div id='slider' class=' ...
- 3532: [Sdoi2014]Lis 最小字典序最小割
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 865 Solved: 311[Submit][Status] ...
- OS X 安装pyspider
pyspider安装的过程中,需要安装pycurl.有几个坑 一.首先遇到权限的问题 因为/Library目录是root权限,所以非root用户对该目录的读写经常会遇到权限问题,但是不宜切换成root ...