244. Shortest Word Distance II

This is a follow up of Shortest Word Distance. The only difference is now you are given the list of words and your method will be called repeatedly many times with different parameters. How would you optimize it?
Design a class which receives a list of words in the constructor, and implements a method that takes two words word1 and word2 and return the shortest distance between these two words in the list.
For example,Assume that words = ["practice", "makes", "perfect", "coding", "makes"]
.
Given word1 = “coding”, word2 = “practice”, return 3.
Given word1 = "makes", word2 = "coding", return 1.

Note:You may assume that word1 does not equal to word2, and word1 and word2 are both in the list.

Solution:

這題和243的區(qū)別是,求兩個(gè)word的最短距離的函數(shù)會(huì)被多次調(diào)用广鳍。如果是用243的方法屁桑,每求一次兩個(gè)詞的最短距離愚争,則每次都需要遍歷整個(gè)數(shù)組,求k對(duì)word的復(fù)雜度為O(kn).

如果利用HashMap<String, ArrayList<Integer>> 來存儲(chǔ)每個(gè)單詞出現(xiàn)的每一個(gè)index推盛,求特定兩個(gè)單詞的最小距離時(shí)只需要關(guān)注兩個(gè)詞所對(duì)應(yīng)的兩個(gè)index的list就可以了。

已知兩個(gè)詞各自的index的list,求最小距離的思路:

1. 分別用i住册,j兩個(gè)指針指向兩個(gè)index list的開頭。
2. 求i瓮具,j當(dāng)前指向的index的差荧飞,并判斷是否更新minDistance;
   如果 i 所對(duì)應(yīng)的 index 小于 j 所對(duì)應(yīng)的 index名党,則 i++叹阔,否則 j++;(增大較小的index传睹,讓 i 和 j 所對(duì)應(yīng)的index盡量靠近耳幢,從而求出最小的distance);
3. 重復(fù)步驟2直到 i 或者 j 不再小于各自index list的長(zhǎng)度(直到越界)

code:

public class WordDistance {

    public HashMap<String, ArrayList<Integer>> hm;
    public WordDistance(String[] words) 
    {
        hm = new HashMap<>();
        for(int i = 0; i < words.length; i ++)
        {
            if(!hm.containsKey(words[i]))
                hm.put(words[i], new ArrayList<>());
            hm.get(words[i]).add(i);
        }
    }

    public int shortest(String word1, String word2) 
    {
        ArrayList<Integer> list1 = hm.get(word1);
        ArrayList<Integer> list2 = hm.get(word2);
        
        int i = 0, j = 0;
        int minDistance = Integer.MAX_VALUE;
        while(i < list1.size() && j < list2.size())
        {
            int index1 = list1.get(i);
            int index2 = list2.get(j);
            int curDistance = Math.abs(index1 - index2);
            if(curDistance < minDistance)
                minDistance = curDistance;
            
            if(index1 < index2) i ++;
            else j ++;
        }
        return minDistance;
    }
}

// Your WordDistance object will be instantiated and called as such:
// WordDistance wordDistance = new WordDistance(words);
// wordDistance.shortest("word1", "word2");
// wordDistance.shortest("anotherWord1", "anotherWord2");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欧啤,一起剝皮案震驚了整個(gè)濱河市睛藻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邢隧,老刑警劉巖店印,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異倒慧,居然都是意外死亡按摘,警方通過查閱死者的電腦和手機(jī)讥邻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來院峡,“玉大人兴使,你說我怎么就攤上這事≌占ぃ” “怎么了发魄?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)俩垃。 經(jīng)常有香客問我励幼,道長(zhǎng),這世上最難降的妖魔是什么口柳? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任苹粟,我火速辦了婚禮,結(jié)果婚禮上跃闹,老公的妹妹穿的比我還像新娘嵌削。我一直安慰自己,他們只是感情好望艺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布苛秕。 她就那樣靜靜地躺著,像睡著了一般找默。 火紅的嫁衣襯著肌膚如雪艇劫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天惩激,我揣著相機(jī)與錄音店煞,去河邊找鬼。 笑死风钻,一個(gè)胖子當(dāng)著我的面吹牛顷蟀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播魄咕,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼衩椒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蚌父!你這毒婦竟也來了哮兰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤苟弛,失蹤者是張志新(化名)和其女友劉穎喝滞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膏秫,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡右遭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窘哈。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吹榴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滚婉,到底是詐尸還是另有隱情图筹,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布让腹,位于F島的核電站远剩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏骇窍。R本人自食惡果不足惜瓜晤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腹纳。 院中可真熱鬧痢掠,春花似錦、人聲如沸嘲恍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛔钙。三九已至锌云,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吁脱,已是汗流浹背桑涎。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兼贡,地道東北人攻冷。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像遍希,于是被迫代替她去往敵國和親等曼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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