最長公共子串行:常用於解決字串的相似度,是指在母串中都出現過並且出現順序與母串保持一致的子串,不要求連續性。
最長公共子串:是指在母串中連續出現的子串。
例如:
cnblogs
belong
最長公共子串行為blog,最長公共子串為lo假設z
=,z2,
⋯,zk
>
是母串
x 與
y的最長公共子串行lcs,那麼
用二維陣列dp
[i][
j]記錄串x1
,x2,
⋯,xi
與y1,
y2,⋯
,yj 的lcs長度,則可得到狀態轉移方程: dp
[i][
j]=⎧
⎩⎨⎪⎪
0,dp
[i−1
][j−
1]+1
max(
dp[i
][j−
1],d
p[i−
1][j
])if i=0
||j=
0if i,
j>0&&
xi=y
jif i,
j>
0andxi
≠̸yj
**實現
//最長公共子串行
int longestcommonsubsequence(string a, string b)
return dp[alen][blen];
}
最長公共子串是最長公共子串行的一種特殊情況,考慮到最長公共子串的連續性,定義狀態轉移方程如下: dp
[i][
j]=⎧
⎩⎨⎪⎪
0,dp
[i−1
][j−
1]+1
0if i=
0||j
=0if i,j
>0&&
xi=y
jif i,
j>
0andxi
≠̸yj
最長公共子串的長度為 ma
x(c[
i,j]
),i∈
(1,⋯
,m),
j∈(1
,⋯,n
) 。
**實現
//最長公共子串
int longestcommonsubstring(string a, string b)
else
dp[i][j] = 0;
}return result;
}
解題思路:
如果能在母串s中找到最長的子串行l,並且這個子串行是回文,那麼插入ans = strlen(s) - strlen(l)個字元就能使得原串成為回文字串。
問題轉為求乙個字串的最長回文子串行,這個問題可以使用最長公共子串行的解法,解法如下:
1.求s的逆序串 s』,;
2.求s和s』的最長公共子串行l,l即為s的最長回文子串行;
3.ans = strlen(s) - strlen(l)。
例如: s = abca 那麼 s』 = acba ,那麼l = aba 那麼答案就是1。即 a『c』bca。其中』c』為插入的字元。
**實現
//新增最少字元使得字串整體為回文字串
int getpalindrome(string str);
}//得到母串與其逆序字串的最長公共子串行長度
int lcslen = longestcommonsubsequence(str, invertedstr);
return
len - lcslen;
}
最長公共子串與最長公共子串行
一 最長公共子串 longest common substring 遍歷的時候用乙個二維陣列儲存相應位置的資訊,如果兩個子串1與子串2相應位置相等 則看各自前乙個位置是否相等,相等則該位置值b i j b i 1 j 1 1,不相等則置為1。如果兩個子串1與子串2相應位置不相等,則b i j 0。如...
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...
最長公共子串行 最長公共子串
1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...