问题:
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 For example, 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. Note: Return 0 if there is no such transformation sequence. All words have the same length. All words contain only lowercase alphabetic characters.
答案:
import java.util.HashSet; import java.util.LinkedList; public class WordLadderTest1 { /** * @param args */ public static void main(String[] args) { String start = "hit"; String end = "cog"; HashSet<String> dict = new HashSet<String>(); dict.add("hot"); dict.add("dot"); dict.add("dog"); dict.add("lot"); dict.add("cog"); System.out.println(ladderLength(start, end, dict)); } public static int ladderLength(String start, String end, HashSet<String> dict) { if (dict.size() == 0) return 0; LinkedList<String> wordQueue = new LinkedList<String>(); LinkedList<Integer> distanceQueue = new LinkedList<Integer>(); wordQueue.add(start); distanceQueue.add(1); while(!wordQueue.isEmpty()){ String currWord = wordQueue.pop(); Integer currDistance = distanceQueue.pop(); if(currWord.equals(end)){ return currDistance; } for(int i=0; i<currWord.length(); i++){ char[] currCharArr = currWord.toCharArray(); for(char c='a'; c<='z'; c++){ currCharArr[i] = c; String newWord = new String(currCharArr); if(dict.contains(newWord)){ wordQueue.add(newWord); distanceQueue.add(currDistance+1); dict.remove(newWord); } } } } return 0; } }
Java Word Ladder(字梯),布布扣,bubuko.com
原文地址:http://blog.csdn.net/soszou/article/details/37671965