Dadas dos palabras (inicio y final) y un diccionario, encuentre la longitud de la secuencia de transformación más corta de principio a fin, de modo que solo se pueda cambiar una letra a la vez y cada palabra intermedia debe existir en el diccionario. Por ejemplo, dado:
start = "hit" end = "cog" dict = ["hot","dot","dog","lot","log"]
Una transformación más corta es «hit» -> «hot» -> «dot» -> «dog» -> «cog», el programa debería devolver su longitud 5.
Solución Java
Este es un problema de búsqueda, y la búsqueda inicial garantiza la solución óptima.
class WordNode{ String word; int numSteps; public WordNode(String word, int numSteps){ this.word = word; this.numSteps = numSteps; } } public class Solution { public int ladderLength(String beginWord, String endWord, Set<String> wordDict) { LinkedList<WordNode> queue = new LinkedList<WordNode>(); queue.add(new WordNode(beginWord, 1)); wordDict.add(endWord); while(!queue.isEmpty()){ WordNode top = queue.remove(); String word = top.word; if(word.equals(endWord)){ return top.numSteps; } char[] arr = word.toCharArray(); for(int i=0; i<arr.length; i++){ for(char c='a'; c<='z'; c++){ char temp = arr[i]; if(arr[i]!=c){ arr[i]=c; } String newWord = new String(arr); if(wordDict.contains(newWord)){ queue.add(new WordNode(newWord, top.numSteps+1)); wordDict.remove(newWord); } arr[i]=temp; } } } return 0; } } |