兩個字串比較求最優演算法

2021-07-12 04:09:45 字數 1007 閱讀 4214

背景如下:

1.char1是乙個由各種字母組成的字串

2.char2是另外乙個相對較短的字串

問題:什麼方法能最快的查出是否所有小字串裡的字母在大字串裡都有?

例如:

char1:asqwertyzxcvbplk

char2:aksectyp

方法1:對於這種操作一種幼稚的做法是輪詢第二個字串裡的每個字母,看它是否同在第乙個字串裡。從演算法上來講,這需要o(n*m)次操作,其中n是char1的長度,m是char2的長度。就拿上面的例子來說,最壞的情況下將會有

16 * 8 = 128 次操作。

方法2:乙個稍微好一點的方案是先對這兩個字串的字母進行排序,然後再同時對兩個字串依次輪詢。兩個字串的排序需要

(m log m)+(n log n)次操作,之後的線性掃瞄需要(m + n)次操作。同樣拿上面的字串做例子,將會需要

16 * 4 + 8 * 3 = 88 加上對兩個字串線性掃瞄的16 + 8 = 24 的操作。

方法3:乙個更好的方法就是,對第乙個字串進行輪詢,把其中的每個字母都放入乙個hashtable裡(成本是o(n) 即16次操作)。然後輪詢第二個字串,在hashtable裡查詢每個字母,看能否找到。如果找不到,說明沒有匹配成功。這將消耗掉8次操作。也就是說,這種方法需要

16 + 8 = 24 次操作。

看到這裡,很多人可能已經覺得方法3是最優解了,是嗎?然後我們再來瞧下另外一種方法:

假設我們有乙個一定個數的字母組成的字串,給每個字母分配乙個素數,從2開始,往後類推,這樣a將會是2,b將會是3,c將會是5,等等。現在遍歷第乙個字串,把每個字母代表的素數相乘。你最終會得到乙個很大的整數。然後,輪詢第二個字串,用每個字母除它。如果除的結果有餘數,這說明有不匹配的字母。如果整個過程中沒有餘數,它就是第乙個字串的子集。

比較兩個字串是否相等

我剛剛才學了組合語言,就寫了乙個很簡單的程式.下面是程式 dseg segment data1 db 9,0,9 dup data2 db 9,0,9 dup cnt db 8 str1 db 13,10,two string is same.str2 db 13,10,two string is ...

sql比較兩個字串 txt

declare stra varchar 100 declare strb varchar 100 declare i int declare issame real select stra abc strb abd i 1,issame 1 while i len stra 1 and i len...

python用is比較兩個字串

首先python的is作用 比較兩個物件的位址值是否相等。也就是說如果id 物件1 id 物件2 那麼物件1 is 物件2返回true 舉個栗子 a spam b spam c this is a long string d this is a long string print a is b pr...