Word Ladder

来源:互联网 发布:windows 10 易升 关闭 编辑:程序博客网 时间:2024/05/16 05:24
import java.util.HashSet;import java.util.Iterator;import java.util.LinkedList;import java.util.Queue;import javax.print.attribute.standard.Finishings;public class WordLadder2 {/** * @param args */public static void main(String[] args) {HashSet<String> dict = new HashSet<String>();dict.add("hot");dict.add("dog");dict.add("lot");dict.add("dot");dict.add("log");int x = ladderLength2("hit", "cog", dict);System.out.println(x);}public static boolean isNeighbor(String str1, String str2) {if (str1.length() != str2.length())return false;int count = 0;for (int i = 0; i < str1.length(); i++) {if (str1.charAt(i) != str2.charAt(i)) {if (count == 1)return false;count++;}}return count == 1;}       //first waypublic static int ladderLength(String start, String end,HashSet<String> dict) {Iterator<String> iter;HashSet<String> used = new HashSet<String>();Queue<String> queue = new LinkedList<String>();queue.add(start);int currNum = 1;int nextNum = 0;int len = 1;while (!queue.isEmpty()) {currNum--;String curr = queue.poll();if (isNeighbor(curr, end))return len + 1;iter = dict.iterator();while (iter.hasNext()) {String temp = iter.next();if (isNeighbor(curr, temp) && !used.contains(temp)) {used.add(temp);queue.add(temp);nextNum++;}}if (currNum == 0) {len++;currNum = nextNum;nextNum = 0;}}return 0;}
        //second waypublic static int ladderLength2(String start, String end,HashSet<String> dict) {HashSet<String> used = new HashSet<String>();Queue<String> queue = new LinkedList<String>();queue.add(start);int currNum = 1;int nextNum = 0;int len = 1;while (!queue.isEmpty()) {currNum--;String curr = queue.poll();for(int i=0;i<curr.length();i++){for(int j=0;j<26;j++){if(curr.charAt(i)=='a'+j)continue;String temp=curr.substring(0,i)+(char)('a'+j)+curr.substring(i+1,curr.length());if(temp.equals(end))return len+1;if(dict.contains(temp)&&!used.contains(temp)){used.add(temp);queue.add(temp);nextNum++;}}}if (currNum == 0) {len++;currNum = nextNum;nextNum = 0;}}return 0;}}