刷题——WordLadder

import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.Queue;

/*
 * 题目描述

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 length5.
Note:
Return 0 if there is no such transformation sequence.
All words have the same length.
All words contain only lowercase alphabetic characters.
 */
public class WordLadder {
	//以类似于树的层次遍历来进行计算
	public int ladderLength(String start, String end, HashSet<String> dict) {
        HashSet<String> finished = new HashSet<String>();//存储已经遍历过的节点
        Queue<String> queue = new ArrayDeque<String>();//使用队列存储每层节点
        queue.add(start);
        finished.add(start);
        int level = 0;
        boolean finishflag = false;
        boolean hasRoute = false;
        while (queue.size()!=0 && !finishflag) {
        	int levelSize = queue.size();//一层有多少个节点
        	hasRoute = false;
        	for (int ith = 0; ith < levelSize; ith++) {
        		String outString = queue.poll();
    			if (outString.equals(end)) {//走到目标单词
    				hasRoute = true;
    				finishflag = true;
    				break;				
    			}
    			
    			for (int i = 0; i < outString.length(); i++) {//对每一位进行替换
    				for (int j = 0; j < 26; j++) {//使用26个英文字母进行替换
    					char[] arr = outString.toCharArray();
    					arr[i] =(char) ('a'+j);
    					String newString = new String(arr);
    					if ((dict.contains(newString)||newString.equals(end)) && !finished.contains(newString)) {//词典中有且未访问过
    						hasRoute = true;//若该层一个节点都没添加则证明后面没通向终点的路了
    						queue.add(newString);
    						finished.add(newString);//防止在下面层再加入
    					}
    				}
    			}	
			}
        	level++;//遍历完一层加1
		
		}
        level = hasRoute?level:0;
        return level;
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HashSet<String> dict = new HashSet<String>();
		dict.add("hot");
		dict.add("dot");
		dict.add("dog");
		dict.add("lot");
		dict.add("log");
		int level = new WordLadder().ladderLength("hit", "cog", dict);
		System.out.println(level);
	}

}
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值