2010-04-14 24 views
1
int n = string.numDifferences("noob", "newb"); // 2 

??查找2個字符串中的差異數量

+9

對於這個問題,什麼構成「差異」?除非你回答這個問題,否則你能得到的最佳答案將是那些指向與問題的不同定義相關的可能算法範圍的那些答案,因爲任何具體的建議僅僅對於問題的單一定義是準確的。 也就是說:你的問題太含糊。 – 2010-04-14 03:45:05

+0

查看[測量編輯距離]的方法之一(http://en.wikipedia.org/wiki/Edit_distance)。 – 2010-04-14 03:41:05

回答

11

您正在嘗試查找的號碼被稱爲edit distance。維基百科列出了您可能想要使用的幾種算法; Hamming distance是一種尋找相同長度的兩個字符串之間的編輯差異的常見方法(它經常用於糾錯碼)。 Levenshtein distance類似,但也會考慮插入和刪除。維基百科當然列出了其他幾個(,例如Damerau-Levenshtein distance,其包括換位);我不知道你想要什麼,因爲我不是專家,選擇是特定領域的。其中之一,應該做的伎倆。

0
import math 
def differences(s1, s2): 
    count = 0 
    for i in range(len(s1)): 
     count += int(s1[i] != s2[1]) 
# count += math.sqrt((len(s1) - len(s2)) **2) #add this line if the two strings are of different length and differences counts the how many characters one string has more than the other. 
    return count 

希望這有助於

+0

爲什麼不''math.fabs'? – 2010-04-14 05:39:20

1

假設你只希望在同一指標來比較字符(使用LINQ提供的方法)下面的C#解決方案應該做的伎倆:

var count = s1.Zip(s2, (c1, c2) => c1 == c2 ? 0 : 1).Sum(); 

這個「壓縮」這兩個字符串,然後爲每個索引返回0,其中字符相同,每個索引的索引位置不同。然後,我們簡單地總結這些數字,然後我們得到結果。

+0

請參閱我對@ Anthony的解決方案的評論。這裏也是一樣的問題:你假設從's1'到's2'的初始轉換,並且不會產生最短的編輯距離。 – wilhelmtell 2010-04-14 04:53:09

+0

@wilhelmtell:是的,我在第一句中提到:-)。目前還不清楚問題是如何計算這樣簡單的天真計數或更復雜的事情...... – 2010-04-14 11:19:43

1

如果你的意思是「編輯距離」,你已經得到了很好的答案。如果你只是表示「是不同的字符數」(對於兩個相同長度的字符串),在Python中,最簡單的方法是:

sum(c1!=c2 for c1, c2 in zip(s1, s2)) 

,如果你也想加入的長度差,追加

+ abs(len(s1) - len(s2)) 

當然,如果你想編輯距離,這種做法就太簡單化;-)。