方法1: 这道题还是比较明显的,用bfs。既然用bfs了,那十有八九要用queue。bfs算法还是比较简单的,不是很难,这边我直接展示自己的代码,复杂度复盘自己分析,暂时我没分析。
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
if(!wordList.contains(endWord)) return 0;
Queue<String> queue = new LinkedList<>();
queue.offer(beginWord);
int count = 1;
List<String> visited = new ArrayList<>();
while(!queue.isEmpty()){
int size = queue.size();
while(size > 0){
String s = queue.poll();
visited.add(s);
List<String> children = findChildren(s, wordList, visited, queue);
if(children.contains(endWord)) return count + 1;
for(String child : children) queue.offer(child);
size--;
}
count++;
}
return 0;
}
public List<String> findChildren(String s, List<String> wordList, List<String> visited, Queue<String> queue){
List<String> res = new ArrayList<>();
for(String str : wordList){
if(oneDiff(s, str) && !visited.contains(str) && !queue.contains(str))
res.add(str);
}
return res;
}
public boolean oneDiff(String s, String str){
int count = 0;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) != str.charAt(i)) count++;
}
return count == 1 ? true : false;
}
}
方法2: bidirectional bfs。从两端同时bfs,直到相遇。这边我陈述的是一个大致的思想,但是下面的代码并不是全部依照上面说的进行,这个代码bidirection体现在beginset和endset交换这行代码上,我们只挑选size小的set进行bfs,所以说整个过程中我们是一会从前往后bfs,一会从后往前bfs,但并不是parallel进行的,这种过程类似concurrent,但不是parallel的。复杂度复盘自己分析。
public class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
Set<String> wordList1 = new HashSet<>(wordList);
if(!wordList1.contains(endWord)) return 0;
Set<String> beginSet = new HashSet<String>(), endSet = new HashSet<String>();
int len = 1;
int strLen = beginWord.length();
HashSet<String> visited = new HashSet<String>();
beginSet.add(beginWord);
endSet.add(endWord);
while (!beginSet.isEmpty() && !endSet.isEmpty()) {
if (beginSet.size() > endSet.size()) {
Set<String> set = beginSet;
beginSet = endSet;
endSet = set;
}
Set<String> temp = new HashSet<String>();
for (String word : beginSet) {
char[] chs = word.toCharArray();
for (int i = 0; i < chs.length; i++) {
for (char c = 'a'; c <= 'z'; c++) {
char old = chs[i];
chs[i] = c;
String target = String.valueOf(chs);
if (endSet.contains(target)) {
return len + 1;
}
if (!visited.contains(target) && wordList1.contains(target)) {
temp.add(target);
visited.add(target);
}
chs[i] = old;
}
}
}
beginSet = temp;
len++;
}
return 0;
}
}
总结:
- 无