1. 程式人生 > >判斷短字串中的每個字母是否都在長字串中出現過

判斷短字串中的每個字母是否都在長字串中出現過

假設這有一個各種字母組成的字串,假設這還有另外一個字串,而且這個字串裡的字母數相對少一些。從演算法上講,什麼方法能最快的查出所有小字串裡的字母在大字串裡都有?  比如,如果是下面兩個字串:  String 1: ABCDEFGHLMNOPQRS  String 2: DCGSRQPOM  答案是true,所有在string2裡的字母string1也都有。如果是下面兩個字串:  String 1: ABCDEFGHLMNOPQRS  String 2: DCGSRQPOZ  答案是false,因為第二個字串裡的Z字母不在第一個字串裡。  方法一[時間複雜度O(m*n)]: 對於這種操作一種幼稚的做法是輪詢第二個字串裡的每個字母,看它是否同在第一個字串裡。從演算法上講,這需要O(n*m)次操作,其中n是string1的長度,m是string2的長度。就拿上面的例子來說,最壞的情況下將會有16*8 = 128次操作。  方法二
:
一個稍微好一點的方案是先對這兩個字串的字母進行排序,然後同時對兩個字串依次輪詢。兩個字串的排序需要(常規情況)O(m log m)+ O(n log n)次操作,之後的線性掃描需要O(m+n)次操作。同樣拿上面的字串做例子,將會需要16*4 + 8*3 = 88加上對兩個字串線性掃描的16 + 8 = 24的操作。(隨著字串長度的增長,你會發現這個演算法的效果會越來越好)    方法三[時間複雜度O(n+m)]: 對第一個字串進行輪詢,把其中的每個字母都放入一個Hashtable裡(成本是O(n)或16次操作)。然後輪詢第二個字串,在Hashtable裡查詢每個字母,看能否找到。如果找不到,說明沒有匹配成功。這將消耗掉8次操作——這樣兩項操作加起來一共只有24次。       方法四
: 假設我們有一個一定個數的字母組成字串——我給每個字母分配一個素數,從2開始,往後類推。這樣A將會是2,B將會是3,C將會是5,等等。現在我遍歷第一個字串,把每個字母代表的素數相乘,你最終會得到一個很大的整數。然後——輪詢第二個字串,用每個字母除它。如果除的結果有餘數,這說明有不匹配的字母。如果整個過程中沒有餘數,你應該知道它是第一個字串恰好的子集了。