126 Word Ladder II

126
Word Ladder II
13.2%
Hard
所有的words可以組成一張圖顿锰。節(jié)點(diǎn)是word苞俘,如果有一個字母不一樣胸梆,那么這兩個節(jié)點(diǎn)之間有一條邊。
可以從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();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榛鼎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鳖孤,更是在濱河造成了極大的恐慌借帘,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淌铐,死亡現(xiàn)場離奇詭異肺然,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腿准,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門际起,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拾碌,“玉大人,你說我怎么就攤上這事街望⌒O瑁” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵灾前,是天一觀的道長防症。 經(jīng)常有香客問我,道長哎甲,這世上最難降的妖魔是什么蔫敲? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮炭玫,結(jié)果婚禮上奈嘿,老公的妹妹穿的比我還像新娘。我一直安慰自己吞加,他們只是感情好裙犹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衔憨,像睡著了一般叶圃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上践图,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天掺冠,我揣著相機(jī)與錄音,去河邊找鬼平项。 笑死,一個胖子當(dāng)著我的面吹牛悍及,可吹牛的內(nèi)容都是我干的闽瓢。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼心赶,長吁一口氣:“原來是場噩夢啊……” “哼扣讼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缨叫,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤椭符,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耻姥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體销钝,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年琐簇,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒸健。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片座享。...
    茶點(diǎn)故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖似忧,靈堂內(nèi)的尸體忽然破棺而出渣叛,到底是詐尸還是另有隱情,我是刑警寧澤盯捌,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站箫攀,受9級特大地震影響瓶籽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汤求,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扬绪。 院中可真熱鬧裤唠,春花似錦、人聲如沸墓赴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刊侯。三九已至,卻和暖如春藕届,著一層夾襖步出監(jiān)牢的瞬間亭饵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工椅贱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庇麦。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像垮媒,于是被迫代替她去往敵國和親航棱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容