126 word Ladder

来源:互联网 发布:nba2017球员数据排名 编辑:程序博客网 时间:2024/05/19 21:40

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;        } }


0 0