字串的相似性:如果將乙個串轉換成為另乙個串所需的運算元最少,那麼可以說這兩個串是相似的。另外一種權衡的方法是,尋換第三個串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用來儲存...