題目
面試題目是這樣子的:
兩個單詞如果包含相同的字母,次序不同,則稱為字母易位詞(anagram)。例如,“silent”和“l(fā)isten”是字母易位詞,而“apple”和“aplee”不是易位詞。請定義函數(shù)檢查兩個單詞是否是字母易位詞。可以假設(shè)兩個單詞字母均為小寫。要求算法復雜度盡量低。
看到這個題目,你的思路是什么?
思路一
首先,最基本的思路,便是檢測字符串s1中的字符是否都出現(xiàn)在s2中(在s1和s2長度一樣的前提下)。為了解決“apple”和“aplee”不是易位詞的這種情況,不能僅僅判斷出現(xiàn)在s2中就可以了,還需要做個標記。這里可以考慮將字符串轉(zhuǎn)換為list,對于比較過的便設(shè)置為None。算法代碼設(shè)計如下:
讓我們考慮一下算法復雜度。可以從字符串s2來考慮,對于s2中的每個元素,s1都會從頭開始進行遍歷一次,所以算法的復雜度為:
即算法的復雜度為O(n^2)。
有沒有算法復雜度更低的思路呢?思考一下。
思路二
通過題目,我們可以想到,字母易位詞即為各個字母的數(shù)目相同,而順序不一致。因而,如果對字符串按照字母順序排序后,那么兩個字符串應該完全一致。這樣算法復雜度是否更低?
先看一下代碼實現(xiàn)如下:
這樣算法復雜度是否是O(n)了呢?因為僅僅進行了n次比較啊。當然不是,為什么呢?因為事先先對兩個字符串進行了排序,而排序的復雜度并未計入。所以,此種算法的復雜度即為O(nlogn+n),為O(nlogn)。復雜度比思路一的復雜度降低了。
有沒有復雜度更低的算法呢?
思路三
思路二利用了字母易位詞即為各個字母的數(shù)目相同,而順序不一致。我們從另外一個角度思考,字母一共有多少個?很明顯,只有26個(只考慮小寫字母)。那么,我們可以為字符串s1和s2分別設(shè)置26個計數(shù)器,然后判斷這對應位置的計數(shù)是否相等,如果對應計數(shù)完全相等,則為字母易位詞。算法代碼實現(xiàn)如下:
算法的復雜度為O(n + n + 26) ,即為O(n),為線性復雜度的算法。
前幾天,一直在跟同事討論怎么面試考察思維反應能力,