查找

word-ladder

题目描述

题目描述
给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列的长度:
每一次转换只能改变一个单词
每一个中间词都必须存在单词字典当中
例如:
给定的初始单词start=“hit”,
目标单词end =“cog”。
单词字典dict =[“hot”,“dot”,“dog”,“lot”,“log”]
一个最短的转换序列为"hit" -> “hot” -> “dot” -> “dog” -> “cog”,
返回长度5

注意:
如果没有符合条件的转换序列,返回0。
题目中给出的所有单词的长度都是相同的
题目中给出的所有单词都仅包含小写字母

题目解析

题目要求找到初始单词到目标单词变化的最短路径长度,我们可以把这个整个路径看出一颗树,层次遍历的方式找到最短路径。如下
hit
hot
lot dot
log dog
cog cog
从根节点开始(初始单词)每次在字典中找与当前节点差一个单词的字符串作为下一个个叶子节点,直到找到与目标节点相差一个字符时的路径。
原题地址

import java.util.*;
public class Solution {
    public int ladderLength(String start, String end, HashSet<String> dict) {
     //计算树的深度,从开始字符,每次替换一个单词,到最后完全变成end字符串
            //hit
           // hot     
     //    lot   dot
     //  log       dog
     // cog         cog
     //使用一个队列存放与当前字符串相差一个的字符串
        int depth = 1;//最短路径
        boolean flag = false;//是否找到路径
        Queue<String> queue = new LinkedList(); //存放当前路径的队列
        queue.offer(start);
        int cnt = queue.size();
        while(!queue.isEmpty()){//当前队列不为空
            for(String str: queue){
                dict.remove(str);//如果字典里有当前字符,证明已经走过的路径,移除掉
            }
            String nowStr = queue.poll();//当前队列的第一个字符串,路径的下一步
            cnt --;
            if(nowStr.equals(end)){//当前字符等于目标字符
                flag = true;
                break;
            }
            for(String str : dict){
                if(isNextPath(nowStr,str)){
                    queue.offer(str);//存放下一步的路径
                }
            }
            if(cnt == 0){//与当前字符相差一个字符的全部找完
                cnt = queue.size();
                depth++;
            }
        }
        if(flag){
            return depth;
        }else{
            return 0;
        }
        
    }
    //判断当前字符在字典是不是有一个只差一个字符的字符串
    public boolean isNextPath(String nowStr,String nextStr){
        int cnt = 0;
        if( nowStr.length()!= nextStr.length()){
            return false;
        }
        for(int i = 0; i < nowStr.length(); i++){
            if(nowStr.charAt(i) != nextStr.charAt(i)){
                cnt ++ ;
            }
        }
        return cnt == 1? true:false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值