許多程式會大量使用字串。對於不同的字串,我們希望能夠有辦法判斷其相似程度。我們定義了一套操作方法來把兩個不同的字串變得相同,具體的操作方法為:
1.修改一個字元(如把"a“替換為"b");
2.增加一個字元(如把"abdd"變為"aebdd");
3.刪除一個字元(如把"travelling"變為"traveling")。
比如,對於“abcdefg“和”abcdef“倆個字串來說,我們認為可以通過增加/減少一個”g“的方式來達到目的。上面的倆種方案,都僅需要一次操作。把這個操作所需要的次數定義為倆個字串的距離,相似性等於”距離+1“的倒數。也就是說,”abcdefg“和”abcdef“的距離為1,相似性為1/2=0.5。
給定任意倆個字串,你是否能寫出一個演算法來計算出它們的相似性呢?
利用LCS的思想:
假設兩個字串A={A1,A2,A3,...},B={B1,B2,B3,...}。採用類似lcs的dp思想。設c[i][j]表示字串A1...Ai,B1...Bj的距離,如果Ai=Bj,則c[i][j]=c[i-1][j-1];
如果Ai!=Bj,c[i][j]=min(c[i-1][j]+1,c[i][j-1]+1,c[i-1][j-1]+1);
代碼如下:
int EditDistance(char* DstStr,char* SrcStr){ char* tmpDstStr= DstStr; char* tmpSrcStr= SrcStr; int c[N][M]; int i=0; int j=0; while(*DstStr++!='\0') i++; while(*SrcStr++!='\0') j++; for(int m=0;m<j;++m) c[0][m]=m; for(int n=0;n<i;++n) c[n][0]=n; for(int m=1;m<=i;++m) for(int n=1;n<=j;++n) if(tmpDstStr[m]==tmpSrcStr[n]) c[m][n]=c[m-1][n-1]; else { c[m][n]=min(c[m-1][n-1]+1,c[m-1][n]+1); c[m][n]=min(c[m][n],c[m][n-1]+1); } return c[i][j];}
之前求:數組中的最長遞增子序列時,對數組先排序,然後找出兩個數組裡的LCS,這個也可以求出LCS,然後Max(SrcStr,DstStr)-LCS。看不出來LCS還這麼有用哦。