2015-04-22 22 views
1

我最近有一個電話是SE的角色,被問及如何確定兩個單詞是否是anagrams,我給出了一個回覆,這個回覆涉及到了獲取角色的一些方面,如果它存在退出循環等。我認爲這是一個N^2解決方案,每個單詞一個循環,內部循環用於比較。使用素數來確定anagrams比循環更快嗎?

電話後,我做了一些挖掘並寫了一個新的解決方案;我計劃在明天的下一階段採訪中提交一個,它使用一個帶有唯一素數的哈希映射表示字母表中的每個字符。 然後我循環遍歷單詞列表,計算單詞的值並檢查它是否與我正在檢查的單詞相比較。如果價值觀相匹配,我們就有贏家(整個數學定理業務)。

這意味着一個循環,而不是兩個,這是好得多,但我開始懷疑自己,並想知道如果哈希映射和乘法的額外操作比原始建議更昂貴。

我99%肯定散列圖將是快,但...

任何人都可以證實或否認了我的懷疑?謝謝。

編輯:我忘了提及,我甚至在考慮做任何事情之前先檢查單詞的大小。

+1

爲什麼這個標記的Java?這是一個有關高效算法的問題嗎?如果不是,這聽起來有些複雜。最後,我的方法只是構建一個'int [26]'和增量/減量。 – chrylis

+0

@chrylis,標記已移除。這是關於算法,對不清晰的道歉。你可以擴展你提到的int [26] inc/dec嗎? – null

回答

6

anagram包含原始單詞的所有字母,順序不同。您正處於正確的軌道上,使用HashMap以線性時間處理單詞,但您的素數想法是不必要的複雜因素。

您的數據結構是一個HashMap,它維護各種字母的計數。您可以在O(n)時間內從第一個單詞中添加字母。關鍵是角色,價值就是頻率。如果該字母不在HashMap尚未,put它的值爲1。如果是,請將其替換爲value + 1

當迭代第二個字的字母時,將從您的計數中減去,而在達到0時刪除一個字母。如果您嘗試刪除不存在的字母,則可以立即聲明它不是字謎。如果你到達最後,HashMap不是空的,它不是一個謎語。否則,這是一個字謎。

或者,您可以用數組替換HashMap。數組的索引對應於該字符,並且該值與以前相同。如果價值下降到-1,它不是一個anagram,並且如果任何值不是0,它不是最後的anagram。

您可以隨時比較原始字符串的長度,如果它們不相同,那麼它們不可能是字謎。在開始部分加入這個檢查意味着你不必檢查最後的所有值是否爲0。如果字符串的長度相同,則任何事物都會產生一個-1或者最後將會有所有0s。

+0

非常感謝您花時間回答。我沒有考慮過這樣使用數組,謝謝。我現在要開始實施。 :) – null

2

乘法的問題是數字會變大。例如,如果字母'c'是11,那麼帶有10個c的字就會溢出一個32位的整數。

您可以減少一些其他數字的結果模數,但那麼您可能會有誤報的風險。

如果你使用大整數,那麼對於長單詞來說,它將會緩慢。

另一種解決方案是對兩個單詞進行排序,然後比較是否相等,或者使用註釋中chrylis建議的字母計數直方圖。

想法是將數組初始化爲零,其中包含每個字母出現的次數。

翻閱第一個單詞中的字母,遞增每個字母的計數。然後閱讀第二個字中的字母,遞減計數。

如果在這個過程結束時計數達到零,那麼這些詞就是anagrams。

+0

感謝您抽出寶貴時間回答,我沒有考慮過溢出並且剛剛測試過。我將嘗試實現前面提到的array dec/inc方法,並看看我如何繼續。再次感謝! – null

相關問題