編程之美 計算字串的相似性

來源:互聯網
上載者:User

許多程式會大量使用字串。對於不同的字串,我們希望能夠有辦法判斷其相似程度。我們定義了一套操作方法來把兩個不同的字串變得相同,具體的操作方法為:

        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還這麼有用哦。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.