程式設計之美 計算字串的相似度

2021-05-22 12:01:45 字數 2257 閱讀 1776

把兩個字串變成相同的基本操作定義如下:

1.     修改乙個字元(如把 a 變成 b)

2.     增加乙個字元 (如 abed 變成 abedd)

3.     刪除乙個字元(如 jackbllog 變成 jackblog)

針對於 jackbllog到jackblog 只需要刪除乙個或增加乙個 l 就可以把兩個字串變為相同。把這種操作需要的次數定義為兩個字串的距離 l, 則相似度定義為1/(l+1) 即距離加一的倒數。那麼jackbllog和jackblog的相似度為 1/1+1=1/2=0.5 也就是所兩個字串的相似度是 0.5,說明兩個字串已經很接近啦。

任意兩個字串的距離都是有限的,都 不會超過他們的長度之和,演算法設計中我們並不在乎通過一系列的修改後,得到的兩個相同字串是什麼樣子。所以每次只需一步操作,並遞迴的進行下一計算。

獲得兩字串之間距離為目的,我們可以用動態規劃的方法思考問題。

邊界 :當字串a匹配完畢或者字串b匹配完畢時 

if (strabegin > straend)

if (strbbegin>strbend)

return 0;

else

return strbend - strbbegin + 1;

if (strbbegin > strbend)

if (strabegin > straend)

return 0;

else

return straend - strabegin + 1;

可能出現的情況 :

if (stra[strabegin] == strb[strbbegin])//字串a與b當前字元一樣 

return stratostrb(stra, strabegin + 1, straend, strb, strbbegin + 1, strbend);

else

x = stratostrb(stra, strabegin + 1, straend, strb, strbbegin + 1, strbend);

y = stratostrb(stra, strabegin, straend, strb, strbbegin + 1, strbend);

z = stratostrb(stra, strabegin+1, straend, strb, strbbegin, strbend);

return mininum(x, y, z) + 1;

全部**:

private int mininum(int x,int y,int z)

int tempnum;

tempnum = x;

if (y < tempnum)

tempnum = y;

if (ztempnum = z;

return tempnum;

public int stratostrb(string stra, int strabegin, int straend, string strb, int strbbegin, int strbend)

//if(stra[stralen] == strb[strblen])

int x, y, z;

if (strabegin > straend)

if (strbbegin>strbend)

return 0;

else

return strbend - strbbegin + 1;

if (strbbegin > strbend)

if (strabegin > straend)

return 0;

else

return straend - strabegin + 1;

if (stra[strabegin] == strb[strbbegin])

return stratostrb(stra, strabegin + 1, straend, strb, strbbegin + 1, strbend);

else

x = stratostrb(stra, strabegin + 1, straend, strb, strbbegin + 1, strbend);

y = stratostrb(stra, strabegin, straend, strb, strbbegin + 1, strbend);

z = stratostrb(stra, strabegin+1, straend, strb, strbbegin, strbend);

return mininum(x, y, z) + 1;

程式設計之美3 3 計算字串的相似度

問題 1.計算兩個字串的最長公共子串行 lcs 且公共子串行在字串中不需要是連續的。2.計算兩個字串的距離,完全相同的字串距離為0,可以通過修改乙個字元 增加乙個字元或刪除乙個字元三種方式來使兩個字串相同,但這些方式會使得距離加1。1.解法 這兩個問題的解法基本相同,都是二維的動態規劃,都考慮字串的...

程式設計之美 3 3 計算字串的相似度

1.簡述 使用兩個字串之間的編輯距離計算它們的相似度,相似度 1 編輯距離 1 兩個字串的編輯距離 指通過下面三種操作可以將兩個字串變為相同的字串需要的次數。1 修改乙個字元 2 增加乙個字元 3 刪除乙個字元。對於 abcdefg 和 abcdef 兩個字串來說,我們認為可以通過增加 減少乙個 g...

程式設計之美系列之計算字串的相似度

題目描述 也就是給乙個源串和目標串,計算最少的運算元,使得源串進行下列操作之後等於目標串。1 在給定的位置插入字元 2 將當前字元替換成任意字元 3 刪除任意字元 題目分析 如果當前兩個字元相等,則結果就是src 1和pattern 1兩個字串的最小運算元。如果不等,就分三種情況 1 如果是在給定的...