Leetcode 127. Word Ladder

Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest transformation sequence from beginWord to endWord, such that:
Only one letter can be changed at a time.
Each transformed word must exist in the word list. Note that beginWord is not a transformed word.
For example,

Given:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log","cog"]
As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.

Note:
Return 0 if there is no such transformation sequence.
All words have the same length.
All words contain only lowercase alphabetic characters.
You may assume no duplicates in the word list.
You may assume beginWord and endWord are non-empty and are not the same.

題意:給定一個(gè)起始單詞和一個(gè)結(jié)束單詞拓颓,還有一個(gè)單詞集合,每次可以變換單詞中一個(gè)字母狮斗,所變換的單詞需要在wordList中脆淹,求起始到結(jié)尾最少需要幾次變換。

思路:

  1. 用深度優(yōu)先搜索凝果,尋找從起始到結(jié)尾的所有方法汇在,然后求這些方法中次數(shù)最少的值浓恳。
public int minLen = Integer.MAX_VALUE;
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
    if (beginWord.equals(endWord) || wordList == null || wordList.size() == 0) {
        return 0;
    }

    HashSet<String> wordSet = new HashSet<>();
    for (String word : wordList) {
        wordSet.add(word);
    }

    searchLadder(beginWord, endWord, wordSet, 1);

    return minLen == Integer.MAX_VALUE ? 0 : minLen;
}

public void searchLadder(String curWord, String endWord, HashSet<String> wordSet, int step) {
    if (curWord.equals(endWord)) {
        minLen = Math.min(step, minLen);
        return;
    }

    List<String> words = nextWords(curWord, wordSet);
    wordSet.remove(curWord);
    for (String word : words) {
        searchLadder(word, endWord, wordSet, step + 1);
    }
    wordSet.add(curWord);
}

public List<String> nextWords(String curWord, HashSet<String> wordSet) {
    List<String> words = new ArrayList<>();
    for (int i = 0; i < curWord.length(); i++) {
        for (char c = 'a'; c <= 'z'; c++) {
            if (c == curWord.charAt(i)) {
                continue;
            }
            String next = curWord.substring(0, i) + c + curWord.substring(i+1);
            if (wordSet.contains(next)) {
                words.add(next);
            }
        }
    }

    return words;
}
  1. 寬度優(yōu)先搜索煮嫌。
    深度搜索會(huì)有很多重復(fù)計(jì)算的步驟笛谦,如abb到bcb,集合是[abc, acc, acb],abb->acb->bcb是最簡變換昌阿,但是深度優(yōu)先搜索會(huì)找出abb->abc->acc->acb->bcb饥脑。
    寬度優(yōu)先搜索,把每個(gè)單詞下次可能變換出的單詞都找出來懦冰,放到隊(duì)列中灶轰,找出的單詞如果之前出現(xiàn)過就過濾掉,因?yàn)檫@些詞出現(xiàn)在當(dāng)前位置肯定不是最短變換方法儿奶,這樣就能過濾掉很多不需要統(tǒng)計(jì)的變換方法框往。

     public int ladderLength(String start, String end, List<String> dict) {
     HashSet<String> words = new HashSet<>();
     for (String word : dict) {
         words.add(word);
     }
    
     // Use queue to help BFS
     Queue<String> queue = new LinkedList<String>();
     queue.add(start);
     queue.add(null);
    
     // Mark visited word
     Set<String> visited = new HashSet<String>();
     visited.add(start);
    
     int level = 1;
    
     while (!queue.isEmpty()) {
         String str = queue.poll();
    
         if (str != null) {
             // Modify str's each character (so word distance is 1)
             for (int i = 0; i < str.length(); i++) {
                 char[] chars = str.toCharArray();
    
                 for (char c = 'a'; c <= 'z'; c++) {
                     chars[i] = c;
    
                     String word = new String(chars);
    
                     // Found the end word
                     if (word.equals(end) && words.contains(word)) return level + 1;
    
                     // Put it to the queue
                     if (words.contains(word) && !visited.contains(word)) {
                         queue.add(word);
                         visited.add(word);
                     }
                 }
             }
         } else {
             level++;
    
             if (!queue.isEmpty()) {
                 queue.add(null);
             }
         }
     }
    
     return 0;
     }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳄抒,一起剝皮案震驚了整個(gè)濱河市闯捎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌许溅,老刑警劉巖瓤鼻,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贤重,居然都是意外死亡茬祷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門并蝗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祭犯,“玉大人秸妥,你說我怎么就攤上這事∥执郑” “怎么了粥惧?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長最盅。 經(jīng)常有香客問我突雪,道長,這世上最難降的妖魔是什么涡贱? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任咏删,我火速辦了婚禮,結(jié)果婚禮上问词,老公的妹妹穿的比我還像新娘督函。我一直安慰自己,他們只是感情好激挪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布侨核。 她就那樣靜靜地躺著,像睡著了一般灌灾。 火紅的嫁衣襯著肌膚如雪搓译。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天锋喜,我揣著相機(jī)與錄音些己,去河邊找鬼。 笑死嘿般,一個(gè)胖子當(dāng)著我的面吹牛段标,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炉奴,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逼庞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞻赶?” 一聲冷哼從身側(cè)響起赛糟,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砸逊,沒想到半個(gè)月后璧南,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡师逸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年司倚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡动知,死狀恐怖皿伺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盒粮,我是刑警寧澤心傀,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拆讯,受9級(jí)特大地震影響脂男,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜种呐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一宰翅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爽室,春花似錦汁讼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啸箫,卻和暖如春耸彪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忘苛。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工蝉娜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扎唾。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓召川,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胸遇。 傳聞我的和親對象是個(gè)殘疾皇子荧呐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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