您好,登錄后才能下訂單哦!
這篇文章主要講解了“c++最長公共子串問題怎么解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“c++最長公共子串問題怎么解決”吧!
有兩個字符串(可能包含空格),請找出其中最長的公共連續子串,輸出其長度。(長度在1000以內)
例如:
輸入:abcde bcd
輸出:3
1、把兩個字符串分別以行和列組成一個二維矩陣。
2、比較二維矩陣中每個點對應行列字符中否相等,相等的話值設置為1,否則設置為0。
3、通過查找出值為1的最長對角線就能找到最長公共子串。
比如:str=acbcbcef,str2=abcbced,則str和str2的最長公共子串為bcbce,最長公共子串長度為5。
針對于上面的兩個字符串我們可以得到的二維矩陣如下:
從上圖可以看到,str1和str2共有5個公共子串,但最長的公共子串長度為5。
為了進一步優化算法的效率,我們可以再計算某個二維矩陣的值的時候順便計算出來當前最長的公共子串的長度,即某個二維矩陣元素的值由record[i][j]=1演變為record[i][j]=1 +record[i-1][j-1],這樣就避免了后續查找對角線長度的操作了。修改后的二維矩陣如下:
遞推公式為:
當A[i] != B[j],dp[i][j] = 0
當A[i] == B[j],
若i = 0 || j == 0,dp[i][j] = 1
否則 dp[i][j] = dp[i - 1][j - 1] + 1
public int getLCS(String s, String s2)
{
if (s == null || t == null)
{
return 0;
}
int l1 = s.length();
int l2 = t.length();
int res = 0;
for (int i = 0; i < l1; i++)
{
for (int j = 0; j < l2; j++)
{
int m = i;
int k = j;
int len = 0;
while (m < l1 && k < l2 && s.charAt(m) == t.charAt(k)) {
len++;
m++;
k++;
}
res = Math.max(res, len);
}
}
return res;
}
public int getLCS(String s, String t)
{
if (s == null || t == null)
{
return 0;
}
int result = 0;
int sLength = s.length();
int tLength = t.length();
int[][] dp = new int[sLength][tLength];
for (int i = 0; i < sLength; i++) {
for (int k = 0; k < tLength; k++) {
if (s.charAt(i) == t.charAt(k)) {
if (i == 0 || k == 0) {
dp[i][k] = 1;
} else {
dp[i][k] = dp[i - 1][k - 1] + 1;
}
result = Math.max(dp[i][k], result);
} else {
dp[i][k] = 0;
}
}
}
return result;
}
簡化一下遞推公式:
當A[i] != B[j],dp[i][j] = 0
否則 dp[i][j] = dp[i - 1][j - 1] + 1
全部都歸結為一個公式即可,二維數組默認值為0
public int getLCS(String s, String t)
{
if (s == null || t == null)
{
return 0;
}
int result = 0;
int sLength = s.length();
int tLength = t.length();
int[][] dp = new int[sLength + 1][tLength + 1];
for (int i = 1; i <= sLength; i++) {
for (int k = 1; k <= tLength; k++) {
if (s.charAt(i - 1) == t.charAt(k - 1)) {
dp[i][k] = dp[i - 1][k - 1] + 1;
result = Math.max(dp[i][k], result);
}
}
}
return result;
}
感謝各位的閱讀,以上就是“c++最長公共子串問題怎么解決”的內容了,經過本文的學習后,相信大家對c++最長公共子串問題怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。