最長公共子串行與字串的相似度問題

2021-06-27 08:25:11 字數 1982 閱讀 2869

字串的相似性:如果將乙個串轉換成為另乙個串所需的運算元最少,那麼可以說這兩個串是相似的。另外一種權衡的方法是,尋換第三個串s3,如果s3都出現在s1和s2中,且出現的順序相同,但不要求在s1和s2中連續,那麼s3的長度越大,就說明相似度越高。

後一種對相似度概念命名為最長公共子串行。

1、最長公共子串行的特徵

如果用暴力搜尋的方法求解lcs問題,就要窮舉x的所有子串行,對每個子串行進行檢查,看它是否是y的子串行,記錄找到的最長的子串行。x對應下標人格集合的乙個子集,那麼x的子串行就有2^m個。

但其實lcs是具有最優子結構的:

令x=, y=。z=為x和y的任意lcs.則有:

(1)如果xm=yn, 則zk = xm = yn,且zk-1是xm-1與yn-1的lcs.

(2)如果xm!=yn,則zk!=xm意味著zk-1是xm-1與y的lcs

(3)如果xm!=yn,則zk!=yn意味著zk-1是yn-1與x的lcs

2、遞迴解

用dp[i][j]表示xi與yj的lcs的長度。

dp[i][j] = 0   if i = 0  or j =0

dp[i][j] = dp[i-1][j-1] +1   if  xi = yj

dp[i][j] = max(dp[i-1][j], dp[i][j-1])  if x1!=yj

**如下:

//#include "stdafx.h"

#include #include using namespace std;

#define maxlength 100

int max(int a,int b)

//既儲存了長度值,又記錄了最長公共子串行

void lcs_length(char x, char y, int m, int n, int c[maxlength], int b[maxlength])

else

} }cout<<"lcs = "<

那麼對於字串相似度的前一種解釋,延伸出這樣一道演算法題目:

計算字串的相似度,定義了一套操作方法,把兩個不同的字串變得相同,具體操作方法:

(1) 修改乙個字元;(2) 增加乙個字元;(3) 刪除乙個字元。

如果所進行的運算元越少,相似度就越高,那麼這道題目就轉換成了,將兩個字串變為相同的字串,所需的最小運算元。

對於兩個字元:a=xabcdae, b=xfdfa。它們的第乙個字元是相同的,那麼只需要計算a[2……7]和b[2……5]的距離就可。如果第乙個字元不同,那麼可以進行這樣的操作:

(1)刪除a串的第乙個字元,然後計算a[2->lena]與b[1->lenb]。

(2)刪除b串的第乙個字元,然後計算a[1->lena]與b[2->lebb]。

(3)修改a串的第乙個字元為b串的第乙個字元,然後計算a[2……lena]與b[2……lenb]

(4)修改b串的第乙個字元為a串的第乙個字元,然後計算a[2……lena]與b[2……lenb]

(5)增加a串的第乙個字元到b串的第乙個字元前,然後計算a[1……lena]與b[2……lenb]

(6)增加b串的第乙個字元到a串的第乙個字元前,然後計算a[2……lena]與b[1……lenb]

即,經過一步操作後,將a[1->lena]與b[2->lenb]變為相同的字串;將a[2->lena]與b[1->lenb]變為相同的字串;將a[2->lena]與b[2->lenb]變為相同的字串。這樣求最小的運算元,就是求這三種情況的最小值。

令dp[i][j]表示a從第i個字元開始,b從第j個字元開始,所需要的運算元。

那麼if  a[i]!=b[j] ,  dp[i][j] = min(dp[i+1][j] , dp[i][j+1], dp[i+1][j+1]) +1

else dp[i][j] = dp[i+1][j+1]

部分**如下:

int dp(int n, int m)

} return dp[0][0];

}

字串求最長公共子串行 相似度計算

方法一 思想 由大到小的擷取並返回 保證如果返回肯定是返回最大的 短字串的處方式 第一次for迴圈 遞減 第二次for迴圈 擷取該長度字串的可行方案個數 然後擷取 長字串長度處理方案 擷取 第一次擷取的字串 可行方案個數 兩次擷取內容一致,返回 1 獲得最長公共子串行 可以 返回 最長公共子串行的長...

最長公共字串和最長公共子串行

給出兩個字串,找到最長公共子串,並返回其長度。建立乙個矩陣來儲存兩個字串出現相同字元的地方,比如 abccd 和 abcefc 就有 abccd a10000 b02000 c00300 e00040 f00000 c00100 這樣就有每次遇到相等的都加上下他的斜上方的位置的值,然後使用乙個max...

字串中最長公共子串行和最長公共子串

例 bdcaba和abcbdab,最長公共子串行為 bcba。dp解法 字串1的長度為length1,字串2的長度為length2,建立乙個二維陣列c length1 length2 用來記錄最長公共子串行的長度,狀態轉移方程為 整個狀態轉移以及二維陣列矩陣c為 生成字串長度加1的0矩陣,m用來儲存...