![图片](https://img-blog.csdnimg.cn/img_convert/e4f6f72d91fad7df058d7d25311e8400.png)
![图片](https://img-blog.csdnimg.cn/img_convert/e4c18792c216a62947035a6567a015d0.png)
package com.likou.one;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Test {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
HashSet<String> words = new HashSet<>(wordList);
if (words.size() == 0 || !wordList.contains(endWord)) {
return 0;
}
words.remove(beginWord);
Queue<String> queue = new LinkedList<>();
queue.add(beginWord);
HashSet<String> visit = new HashSet<>();
visit.add(beginWord);
int flag = 1;
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
String word = queue.poll();
char[] currentWord = word.toCharArray();
if (changeWordEveryOneLetter(currentWord, words, visit, queue, endWord)) {
return flag+1;
}
}
flag++;
}
return 0;
}
public boolean changeWordEveryOneLetter(char[] currentWord, HashSet<String> words,
HashSet<String> visit, Queue<String> queue, String endWord){
for (int i = 0; i < endWord.length(); i++) {
char orginChar = currentWord[i];
for (char j = 'a'; j <= 'z'; j++) {
if (j == orginChar) {
continue;
}
currentWord[i] = j;
String word = String.valueOf(currentWord);
if (words.contains(word)) {
if (word.equals(endWord)) {
return true;
}
if (!visit.contains(word)) {
queue.add(word);
visit.add(word);
}
}
}
currentWord[i] = orginChar;
}
return false;
}
}
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
HashSet<String> words = new HashSet<>(wordList);
if (words.size() == 0 || !wordList.contains(endWord)) {
return 0;
}
int flag = 1;
HashSet<String> visit = new HashSet<>();
HashSet<String> startWords = new HashSet<>();
startWords.add(beginWord);
HashSet<String> endWords = new HashSet<>();
endWords.add(endWord);
while (!startWords.isEmpty() && !endWords.isEmpty()) {
if (startWords.size() > endWords.size()) {
HashSet<String> temp = startWords;
startWords = endWords;
endWords = temp;
}
HashSet<String> newStartWords = new HashSet<>();
for (String word : startWords) {
char []currentWord = word.toCharArray();
if (changeWordEveryOneLetter(currentWord, words, visit, endWords, newStartWords)) {
return flag+1;
}
}
flag++;
startWords = newStartWords;
}
return 0;
}
public boolean changeWordEveryOneLetter(char[] currentWord, HashSet<String> words,
HashSet<String> visit,
HashSet<String> endWords,
HashSet<String> newStartWords){
for (int i = 0; i < currentWord.length; i++) {
char orginChar = currentWord[i];
for (char j = 'a'; j <= 'z'; j++) {
if (j == orginChar) {
continue;
}
currentWord[i] = j;
String word = String.valueOf(currentWord);
if (words.contains(word)) {
if (endWords.contains(word)) {
return true;
}
if (!visit.contains(word)) {
newStartWords.add(word);
visit.add(word);
}
}
}
currentWord[i] = orginChar;
}
return false;
}
}