126 word Ladder

Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

Return

  [
    ["hit","hot","dot","dog","cog"],
    ["hit","hot","lot","log","cog"]
  ]

Note:

  • All words have the same length.
  • All words contain only lowercase alphabetic characters.
public class Solution {
    public List<List<String>> findLadders(String start, String end, Set<String> dict) {
        List<List<String>> result=new ArrayList<List<String>>();
        HashMap<String,Integer> map=ladderLength(start,end,dict);
        if (map.containsKey(end)==false) return result;
        int ladderSize=map.get(end);
        result=getLadders(start,end,map,ladderSize);
        return result;
    }
    public List<List<String>> getLadders(String start, String end, HashMap<String, Integer> map,int ladderSize){
        List<List<String>> result=new ArrayList<List<String>>();
        List<String> oneStep = new ArrayList<String>();
        if(ladderSize==1){
            oneStep.add(start);
            result.add(oneStep);
            return result;
        }
        String temp="";
        for(int i=0;i<end.length();i++){
            for(int j=0;j<26;j++){
                char m=(char)('a'+j);
                temp=end.substring(0,i)+m+end.substring(i+1);
                if(map.containsKey(temp)&&map.get(temp)==ladderSize-1){
                    oneStep.add(temp);
                }
            }
        }
        for(int i=0;i<oneStep.size();i++){
            List<List<String>> tempList=getLadders(start,oneStep.get(i),map,ladderSize-1);
            for(int j=0;j<tempList.size();j++){
                List<String> tempPath=tempList.get(j);
                tempPath.add(end);
             result.add(tempPath);
            }
        }
        return result;
    }
    
    public HashMap<String,Integer> ladderLength(String start, String end, Set<String> dict) {
        HashMap<String,Integer> map=new HashMap<String,Integer>();
        Queue<String>q=new LinkedList<String>();
        String word="",temp="";
        q.add(start);
        map.put(start,1);
        int curstep=0;
        while(q.isEmpty()==false){
            word=q.poll();
            curstep=map.get(word);
            if(word.compareTo(end)==0) break;
            for(int i=0;i<word.length();i++){
                for(int j=0;j<26;j++){
                    char m=(char)('a'+j);
                    temp=word.substring(0,i)+m+word.substring(i+1,word.length());
                    if(dict.contains(temp)&&!map.containsKey(temp)){
                        map.put(temp,curstep+1);
                        q.add(temp);
                    }
                }
            }
        }
            return map;
        }
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值