乙個十分有趣的字串演算法題目

2021-07-04 22:46:53 字數 1172 閱讀 5788

在blogspot上看到乙個十分有趣的字串演算法題目,作者講述了自己面試google的一次經歷。本文不理會這個故事,只來討論一下裡面著個有趣的演算法。

演算法題目:有兩個字串由不同的字母組成,一長一短,長的為a短的為b。設計乙個演算法,如果所有在b中出現的字元都在a中出現,則返回true,否則返回false。

例子:如下字串:

字串a: abddfdioegdddffsfagj

字串b: dofsjadg

字串b中每個字元都在a中出現,返回true。

如下字串:

字串a: aaaabbbbbbdddddd

字串b: acc

字串b中有字元沒在a中出現,返回false。

這只是個很基礎的演算法題目,相信很多人都能夠立刻想出答案。

答案1:對字串b中的每個字母在a中都遍歷一遍。這個答案很爛,其時間複雜度為o(n*m)

答案2:設乙個雜湊表,對字串a的字元遍歷,將每個字元對應的雜湊表中的值設為1。然後對b中的字元進行遍歷,如果所有字元對應的hash值都為1,則返回true,否則返回false。

這個答案的時間複雜度是o(m+n),應該是大多數面試者想要的答案,相信大多數人也能想到。這樣結束了?如果真結束了,那就談不上有趣了!如果我們對空間要求比較高該怎麼辦?

答案3:我們可以觀察到,字母總共就有26個,而且在上面答案中,hash表的值只有1和0兩種情況。那就好辦了,我們知道int型別是32位,如果用1位(bit)來表示乙個字母是否出現,那麼只需1個int型別就能夠表示所有的字母了。

答案3實際上跟答案2類似,換湯不換藥。有趣的不是他,實際上還存在一種更有意思的方法:

答案4:我們為每個字母(假設字母的數量是一定的)分配乙個不重複素數,比如a為2, b為3, c為5,以此類推。這樣在對字串a進行遍歷時,將每個字元表示的素數相乘,最終得到乙個比較大的整數。然後從字串b中第乙個字母開始,用每個字母所代表的數除這個整數,如果餘數不為0,那麼就返回false。如果整個遍歷過程中都沒有餘數,則返回true。

在我第一次從原文中看到著個答案的時候,有一種眼前一亮的感覺。實際上仔細推敲,這種演算法的效率並不一定比之前的答案要高,因為往往乙個乘法/除法的效率要小於加減法或者比較運算。但是卻給出了一種全新的考慮問題的角度,有種奇思妙想的感覺!這種方法更為巧妙,有趣!

在每個演算法題目中,你在得到乙個公認的比較有效的方法後,是否考慮過更簡單、有趣的方法呢?

乙個十分有趣的笑話

我想起來了,兩年前我去立陶宛旅遊的時候,我們的導遊講了乙個十分有趣的笑話 前蘇聯衰落之後我們國家終於自由了,但是十分落後,在會議上領導人商議怎麼才能把國家經濟搞上去。有乙個委員提出令人驚訝的建議 跟俄羅斯戰爭。這 句話在其他委員中引起軒然大波,隨後另乙個委員問他,這對立陶瓦會有什麼好處,因為打敗 是...

乙個十分簡短的Tween

說它短,是因為總共核心 注釋不到100行。需要宣告一下的是此 非原創,但略有修改,加了自已的部分註解 function getel id 4 5 fileoverview tween6 7 function tween c,b,a 11 if b 14 if a 17 18 tween.protot...

乙個十分簡短的Tween

說它短,是因為總共核心 注釋不到100行。需要宣告一下的是此 非原創,但略有修改,加了自已的部分註解 function getel id 4 5 fileoverview tween6 7 function tween c,b,a 11 if b 14 if a 17 18 tween.protot...