計算兩個字串的距離

2021-06-22 09:41:35 字數 1398 閱讀 7211

題目描述:

對於不同的字串,希望能夠有辦法判斷其相似程度。定義了如下方法來把兩個不同的字串變得相同,具體的操作方法為:

1. 修改乙個字元 (如把"a"替換為"b")

2. 增加乙個字元 (如把"abc"變換為"aabc")

3. 刪除乙個字元 (如把"abc"變換為"bc")

比如,對於」abc」和」bc」兩個字串來說,可以通過增加/刪除乙個」a」的方式來達到目的。上面的兩種方案,都僅需要一次操作。把這個操作所需要的次數定義為兩個字串的距離,而相似度等於」距離+1」的倒數。也就是說,」abc」和」bc」的距離為1,相似度為1/(1+1)=0.5。

給定任意兩個字串,寫出乙個演算法來計算它們的相似度。

分析:如果有兩個字串a和b,如果它們的第乙個字元是相同的,只要計算a[2,…,lena]和b[2,…,lenb]的距離。如果它們的第乙個字元是不相同的,那麼可以進行如下的操作。

1. 刪除a的第乙個字元,然後計算a[2,…,lena]和b[1,…,lenb]的距離;

2. 刪除b的第乙個字元,然後計算a[1,…,lena]和b[2,…,lenb]的距離;

3. 修改a的第乙個字元為b的第乙個字元,然後計算a[2,…,lena]和b[2,…,lenb]的距離;

4. 修改b的第乙個字元為a的第乙個字元,然後計算a[2,…,lena]和b[2,…,lenb]的距離;

5. 增加a的第乙個字元到b第乙個字元之前,然後計算a[2,…,lena]和b[1,…,lenb]的距離;

6. 增加b的第乙個字元到a第乙個字元之前,然後計算a[1,…,lena]和b[2,…,lenb]的距離。

從上面的分析可以看出,如果a和b的第乙個字元不相同,那麼可以不管之後會變成什麼樣,就可以把上面的6個操作合併成下面3個。

1. 一步操作之後,計算a[2,…,lena]和b[1,…,lenb]的距離;

2. 一步操作之後,計算a[1,…,lena]和b[2,…,lenb]的距離;

3. 一步操作之後,計算a[2,…,lena]和b[2,…,lenb]的距離。 

由以上分析可以寫出下面的遞迴**:

#include

#include

using

namespace std;

inline

int getmin(int a, int b, int c)

intcalculatedistance(int pa, int pb, int lena, int lenb, const

char* a, const

char* b)

else 

}if(pb >= lenb)

else 

}if(a[pa] == b[pb])

else

return 0;

}int

main()

計算兩個字串的距離演算法

題目的描述為 將乙個字串變成另乙個字串,方式為新增乙個字元,刪除乙個字元,替換乙個字元,求這些操作的做小次數,例如字串db adcb 兩個字串,通過新增a和c兩個字元獎db編輯成adcb,這個兩個字串的距離為2 思路 定義乙個二維代價陣列dp n m 設新增乙個字元的代價為 ic inseret c...

求兩個字串的距離

給定兩個長度相等的,由小寫字母組成的字串s1和s2,定義s1和s2的距離為兩個字串有多少個位置上的字母不相等。現在牛牛可以選定兩個字母x1和x2,將s1中的所有字母x1均替換成x2。x1和x2可以相同 牛牛希望知道執行一次替換之後,兩個字串的距離最少為多少。x1和x2是自己求的,未知 輸入 aaa ...

兩個字串的最短串編輯距離

假定有兩個字串s1,s2,求出由s1變為s2所需要花費的最小代價。刪除乙個字元的代價為1,增加乙個字元的代價為2,替換乙個字元的代價為2。比如由 abc 變為 abe 你可以刪除c,然後新增e,這樣代價是3 也可以將c替換成e,這樣代價是2,顯然2比較小。具體串編輯問題請參閱演算法書籍。本 運用的是...