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

2021-06-07 18:15:47 字數 1241 閱讀 8181

問題:

1. 計算兩個字串的最長公共子串行(lcs),且公共子串行在字串中不需要是連續的。

2. 計算兩個字串的距離,完全相同的字串距離為0,可以通過修改乙個字元、增加乙個字元或刪除乙個字元三種方式來使兩個字串相同,但這些方式會使得距離加1。

1.解法:

這兩個問題的解法基本相同,都是二維的動態規劃,都考慮字串的字尾(實際上用動態規劃更喜歡考慮字首,但使用字首時陣列最好從位置1開始,因為dp陣列的初始化一般要占用位置0,但字串不方便從1開始讀入,所以在解決問題是使用字尾,用位置n進行初始化)。

f(i,j)表示a從位置i開始的字尾與b從位置j開始的字尾的最長公共子串行z從位置k開始的字尾的長度。這裡的i,j都是階段,也就是兩個階段變數,狀態只有1個,決策有兩個即相等或不等。

// 設z為a和b的最長公共子串行,dp[i][j]表示a從位置i開始的字尾與

// b從位置j開始的字尾的最長公共子串行z從位置k開始的字尾的長度

int main()

for(i=0;i<=n;i++)

printf("%d\n", dp[0][0]);

}2. 解法:

f(i,j)表示字

符串a從位置i開始的字尾與字串b從位置j開始的字尾的距離。這裡的i,j都是階段,也就是兩個階段變數,狀態只有1個,決策有兩個即相等或不等。

#include #include #include using namespace std;

#define maxn 10001

char a[maxn];

char b[maxn];

int dp[maxn][maxn];

// dp[i][j]表示字串a從位置i開始的字尾與

// 字串b從位置j開始的字尾的距離

int main()

} for (i=0; i<=n; i++)

printf("%d\n", dp[0][0]);

}

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

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

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

把兩個字串變成相同的基本操作定義如下 1.修改乙個字元 如把 a 變成 b 2.增加乙個字元 如 abed 變成 abedd 3.刪除乙個字元 如 jackbllog 變成 jackblog 針對於 jackbllog到jackblog 只需要刪除乙個或增加乙個 l 就可以把兩個字串變為相同。把這種...

程式設計之美讀書筆記 3 3 計算字串的相似度

3.3 計算字串的相似度 和計算兩字串的最長公共子串行相似。設ai為字串a a1a2a3 am 的前i個字元 即為a1,a2,a3 ai 設bj為字串b b1b2b3 bn 的前j個字元 即為b1,b2,b3 bj 設l i j 為使兩個字串和ai 和bj相等的最小操作次數。當ai等於bj 時 顯然...