字串包含問題演算法

2021-07-02 04:41:15 字數 1039 閱讀 3713

現在假設有2個字串r和s,其中m=r.len>n=s.len,設計乙個演算法判斷字串s中的每個字元在r串中均存在.

顯然,很容易想到的乙個演算法,最粗魯最暴力演算法,其時間複雜度o(m*n)(也就是對s字串中的每個字元在r中進行查詢判斷)。這或許是我自己想到的最快的方法了。顯而易見,這樣的演算法或許不是演算法。如何降低其時間複雜度呢?當時我想到了利用hash演算法,但是沒有仔細深入思考,然後看了字串是否包含問題這篇文章,可謂收穫頗多。現在將看到的演算法重新總結一次,大體可以總結為以下幾類:

1、先排序後比較

顯然,排序的方法我們有多重選擇,其中最常見的位快速排序,這樣時間複雜度將會降低到

o(nlogn+mlogm+n). 在原文中,提到了計數排序方法(此時我還不確定我是否見過此排序方法,稍候學習下),可以講時間複雜度降低到o(m+n)

2、利用hash table

首先將s串中的字元hash後,然後再hash r串中的字元,再進行比較。

1、hash[26],先全部清零,然後掃瞄短的字串,若有相應的置1,

2、計算hash[26]中1的個數,記為m

3、掃瞄長字串的每個字元a;若原來hash[a] == 1 ,則修改hash[a] = 0,並將m減1;若hash[a] == 0,則不做處理

4、若m == 0 or 掃瞄結束,退出迴圈。

原文中o(n+m)的陣列儲存方法我覺得其實也就是hash方法而已。

3、最精妙的方法——利用素數乘積

定義最小的26個素數分別與字元'a'到'z'對應。

遍歷長字串,求得每個字元對應素數的乘積。

遍歷短字串,判斷乘積能否被短字串中的字元對應的素數整除。

輸出結果。

上述演算法的時間複雜度為o(m+n),時間複雜度最好的情況為o(n)。這個演算法思路非常好,可以用到很多方面。

下面這個題目可以使用到這個方法:

乙個單詞單詞字母交換,可得另乙個單詞,如army->mary,成為兄弟單詞。提供乙個單詞,在字典中找到它的兄弟。描述資料結構和查詢過程。

謝謝參考文獻作者所做總結。

演算法 字串是否包含問題

在網上看到這篇文章 一次谷歌面試趣事。覺得其中的演算法題以及作者的解決思路很有趣,就拿來分享一下吧。問題假設這有乙個各種字母組成的字串,假設這還有另外乙個字串,而且這個字串裡的字母數相對少一些。從演算法是講,什麼方法能最快的查出所有小字串裡的字母在大字串裡都有?比如,如果是下面兩個字串 string...

演算法 字串包含

給定兩個分別由字母組成的字串a和字串b,字串b的長度比字串a短。請問,如何最快地判斷字串b中所有字母是否都在字串a裡?為了簡單起見,我們規定輸入的字串只包含大寫英文本母,請實現函式bool stringcontains string a,string b 比如,如果是下面兩個字串 string 1 ...

字串包含演算法

題目如下 給定乙個長字串a和短字串b,如何判斷短字串b中所有字元的是否都在長字串a中?方法如下 1.簡單粗暴的方法 蠻力輪詢 不推薦 思路 遍歷字串b中的每乙個字元,判斷該字元是否在字串a中。時間複雜度 o nm 其中n為a的長度,m為b的長度 2.排序後輪詢 思路 先對字串a和字串b進行排序,然後...