97 lines
3.6 KiB
Java
97 lines
3.6 KiB
Java
package Strings;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Arrays;
|
|
import java.util.LinkedList;
|
|
import java.util.Queue;
|
|
import java.util.HashSet;
|
|
|
|
/*
|
|
**Problem Statement:**
|
|
A transformation sequence from word beginWord to word endWord using a dictionary wordList is a sequence of words beginWord -> s1 -> s2 -> ... -> sk such that:
|
|
|
|
Every adjacent pair of words differs by a single letter.
|
|
Every si for 1 <= i <= k is in wordList. Note that beginWord does not need to be in wordList.
|
|
sk == endWord
|
|
Given two words, beginWord and endWord, and a dictionary wordList, return the number of words in the shortest transformation sequence from beginWord to endWord, or 0 if no such sequence exists.
|
|
|
|
**Example 1:**
|
|
Input: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
|
|
Output: 5
|
|
Explanation: One shortest transformation sequence is "hit" -> "hot" -> "dot" -> "dog" -> cog", which is 5 words long.
|
|
|
|
**Example 2:**
|
|
Input: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
|
|
Output: 0
|
|
Explanation: The endWord "cog" is not in wordList, therefore there is no valid transformation sequence.
|
|
|
|
**Constraints:**
|
|
1 <= beginWord.length <= 10
|
|
endWord.length == beginWord.length
|
|
1 <= wordList.length <= 5000
|
|
wordList[i].length == beginWord.length
|
|
beginWord, endWord, and wordList[i] consist of lowercase English letters.
|
|
beginWord != endWord
|
|
All the words in wordList are unique.
|
|
*/
|
|
|
|
class WordLadder {
|
|
|
|
/** Driver Code */
|
|
public static void main(String []args){
|
|
|
|
String beginWord = "hit";
|
|
String endWord = "cog";
|
|
String words[] = {"hot","dot","dog","lot","log","cog"};
|
|
List<String> wordList = Arrays.asList(words);
|
|
|
|
System.out.println("Ladder Length: " + ladderLength(beginWord,endWord,wordList));
|
|
}
|
|
|
|
/**
|
|
* This function finds the ladderLength
|
|
* @param beginWord: Starting word of the ladder
|
|
* @param endWord: Ending word of the ladder
|
|
* @param wordList: This list contains the words which needs to be included in ladder.
|
|
* @return ladderLength: This function will return the ladderLength(level) if the endword is there.
|
|
* Otherwise, will return the length as 0.
|
|
*/
|
|
|
|
public static int ladderLength(String beginWord, String endWord, List<String> wordList) {
|
|
HashSet<String> set = new HashSet();
|
|
for(String word : wordList){
|
|
set.add(word);
|
|
}
|
|
|
|
if(!set.contains(endWord)) return 0;
|
|
|
|
Queue<String> queue = new LinkedList();
|
|
queue.offer(beginWord);
|
|
int level = 1;
|
|
|
|
while(!queue.isEmpty()){
|
|
int size = queue.size();
|
|
for(int i = 0; i < size; i++){
|
|
String curr = queue.poll();
|
|
char[] words_chars = curr.toCharArray();
|
|
for(int j = 0; j < words_chars.length; j++){
|
|
char original_chars = words_chars[j];
|
|
for(char c = 'a'; c <= 'z'; c++){
|
|
if(words_chars[j] == c) continue;
|
|
words_chars[j] = c;
|
|
String new_word = String.valueOf(words_chars);
|
|
if(new_word.equals(endWord)) return level+1;
|
|
if(set.contains(new_word)){
|
|
set.remove(new_word);
|
|
queue.offer(new_word);
|
|
}
|
|
}
|
|
words_chars[j] = original_chars;
|
|
}
|
|
}
|
|
level++;
|
|
}
|
|
return 0;
|
|
}
|
|
} |