美文网首页
126 Word Ladder II

126 Word Ladder II

作者: 火焰婆婆 | 来源:发表于2015-09-12 16:40 被阅读0次

    126
    Word Ladder II
    13.2%
    Hard
    所有的words可以组成一张图。节点是word,如果有一个字母不一样,那么这两个节点之间有一条边。
    可以从start -> end (找到后的添加顺序是end->start),也可以end->start(添加顺序相反,start->end)
    hashmap存查找的路径
    end-> start

    public class Solution {
        public List<List<String>> findLadders(String start, String end, Set<String> wordList) {
            //search from end to start
            List<List<String>> rst = new ArrayList<List<String>>();
            wordList.remove(end);
            wordList.add(start);
            HashMap<String, ArrayList<String>> path = new HashMap<String, ArrayList<String>>();
            path.put(end, null);
            HashMap<String, ArrayList<String>> pathHasAdded = new HashMap<String, ArrayList<String>>();
            pathHasAdded.put(end, null);
            while (!path.containsKey(start)){
                HashMap<String, ArrayList<String>> pathToBeAdded = new HashMap<String, ArrayList<String>>();
                for (String word:pathHasAdded.keySet()){
                    ArrayList<String> neighbourWords = neighbourWords(word);
                    for (String nword:neighbourWords){
                        if (!path.containsKey(nword) && wordList.contains(nword)){
                            if (!pathToBeAdded.containsKey(nword)) pathToBeAdded.put(nword, new ArrayList<String>());
                            pathToBeAdded.get(nword).add(word);
                        }
                    }
                }
                if (pathToBeAdded.isEmpty()) return rst;
                path.putAll(pathToBeAdded);
                pathHasAdded = pathToBeAdded;
            }
            LinkedList<String> output = new LinkedList<String>();
            output.add(start);
            dfs(rst, path, output,end);
            return rst;
        }
        private ArrayList<String> neighbourWords(String word){
            ArrayList<String> rst = new ArrayList<String>();
            char[] charArray = word.toCharArray();
            for (int i=0; i<word.length();i++){
                char bakChar = charArray[i];
                for (char varChar = 'a'; varChar<='z'; varChar++){
                    charArray[i] = varChar;
                    String varString = new String(charArray);
                    rst.add(varString);
                }
                charArray[i] = bakChar;
            }
            return rst;
        } 
        private void dfs(List<List<String>> rst, HashMap<String, ArrayList<String>> map, LinkedList<String> output, String end){
            if (output.getLast().equals(end)){
                rst.add((List<String>)output.clone());
                return;
            }
            for (String nextWord:map.get(output.getLast())){
                output.addLast(nextWord);
                dfs(rst, map, output, end);
                output.removeLast();
            }
        }
    }
    

    start->end

    public class Solution {
        public List<List<String>> findLadders(String start, String end, Set<String> dict) {
            dict.add(end);
            dict.remove(start);
            HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
            // (a,b,c) -> d
            HashSet<String> currSearch = new HashSet<String>();
            currSearch.add(start);
            while (!currSearch.isEmpty()){
                HashSet<String> nextSearch = new HashSet<String>();
                for (String s:currSearch){
                    ArrayList<String> sList = transform(s);
                    for (String sNext:sList){
                        if (dict.contains(sNext)){
                            if (!map.containsKey(sNext)) map.put(sNext,new ArrayList<String>());
                            map.get(sNext).add(s);
                            nextSearch.add(sNext);
                        }
                    }
                }
                if (nextSearch.contains(end)) break;
                dict.removeAll(nextSearch);
                currSearch = nextSearch;
            }
            List<List<String>> rst = new ArrayList<List<String>>();
            if (!map.containsKey(end)) return rst;
            LinkedList<String> output = new LinkedList<String>();
            output.addFirst(end);
            dfs(rst,map,output,start);
            return rst;
        }
        private ArrayList<String> transform(String s){
            char[] cha = s.toCharArray();
            ArrayList<String> list = new ArrayList<String>();
            for (int i=0; i<cha.length; i++){
                char bak = cha[i];
                for (char j='a'; j<='z'; j++){
                    cha[i] = j;
                    list.add(new String(cha));
                }
                cha[i] = bak;
            }
            return list;
        }
        private void dfs(List<List<String>> rst, HashMap<String,ArrayList<String>> map, LinkedList<String> output, String start){
            if (output.getFirst().equals(start)){
                rst.add((List<String>)output.clone());
                return;
            }
            for (String prevString:map.get(output.getFirst())){
                output.addFirst(prevString);
                dfs(rst,map,output,start);
                output.removeFirst();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:126 Word Ladder II

          本文链接:https://www.haomeiwen.com/subject/exupcttx.html