查詢兩個字串a,b中的最長公共子串

2021-07-29 08:17:13 字數 2170 閱讀 3838

查詢兩個字串a,b中的最長公共子串。若有多個,輸出在較短串中最先出現的那個。

輸入描述:

輸入兩個字串

輸出描述:

返回重複出現的字元

輸入例子:

abcdefghijklmnop

abcsafjklmnopqrstuvw

輸出例子:

jklmnop
1.第一種解法,動態規劃,dp[i][j] 記錄的是短字串 s1 前 i 個字元和長字串 s2 前 j 個字元的最長公共子串。當 s1[i-1] == s2[i-1]時考慮是否是 dp[i-1][j-1] 後續字元,如果是則 dp[i][j] = dp[i-1][j-1]+s1[i-1],如果不是則 dp[i][j] 是 dp[i-1][j-1]、dp[i-1][j]和 dp[i][j-1] 中較長的字串;如果s1[i-1] != s2[i-1],dp[i][j] 是 dp[i-1][j-1]、dp[i-1][j]和 dp[i][j-1] 中較長的字串。這裡要特別注意題目條件,最長的子串是較短輸入字串中最先出現的。

**:

#include #include using namespace std;

string maxcommonsubstr(string s3, string s4)

for(int i = 0; i < m+1; i++)

dp[i][0] = "";

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

dp[0][i] = "";

for(int i = 1; i < m+1; i++)

if(len > dp[i-1][j-1].length() && len > dp[i-1][j].length() && len > dp[i][j-1].length())

else else

}} else else }}

}string maxstr = dp[m][n];

for(int i = 0; i < m+1; i++)

delete dp;

dp = 0;

return maxstr;

}void test1()

}int main()

2.第二種解法,也是動態規劃,但是思路簡單很多。dp[i][j] 記錄短字串 s1 前 i 個字元和長字串 s2 前 j 個字元的最長子串的長度,初始化所有值為 0。當 s1[i-1] = s2[j-1]時,dp[i][j] = dp[i-1][j-1]+1,注意要使用乙個額外的值 start 來記錄最長子串在短字串 s1 中出現的起始位置和 maxlen記錄當前最長子串的長度,當dp[i][j] > maxlen 時 start = i-dp[i][j];檔s1[i-1] != s2[j-1]時不需要任何操作,這樣dp[i][j]就是預設值 0。

**:

#include #include using namespace std;

string maxcommonsubstr(string s1, string s2)

int start = 0, maxlen = 0;

for(int i = 1; i < m+1; i++)}}

}for(int i = 0; i < m+1; i++)

delete dp;

dp = 0;

return s3.substr(start, maxlen);

}void test1()

}int main()

3.第三種解法,就是通過暴力解法。根據短字串從最大長度依次遞減,在長字串中查詢是否有匹配的子串,但是這種方法的複雜度是 o(n1*n1*n2),空間複雜度是 o(1), 前面兩種動態規劃的時間複雜度是 o(n1*n2),但空間複雜度是 o(n1*n2)。

**:

#include #include using namespace std;

string maxcommonsubstr(string s1, string s2)}}

return "";

}void test1()

}int main()

查詢兩個字串a,b中的最長公共子串。

題目描述 查詢兩個字串a,b中的最長公共子串。若有多個,輸出在較短串中最先出現的那個。首先找到a和b中最短的那個字串。這道題我覺得最巧妙的解法是利用了substr擷取a中的字串,每擷取一部分就去b中查詢,若在b中,就把最長的字串儲存起來。另外需要注意的是find函式返回的是size t型別的值,需要...

求兩個字串最長公共字串

package com.test 求兩個字串最長公共字串,演算法 兩個字串形成乙個矩陣,將兩個字元不匹配的位置標記為0,c i j 中兩個字元相匹配的位置標記為n,其中n c i 1 j 1 1,其中沿正對角線方向最長的序列為兩個字串的最長公共子串行 public class lcs public ...

兩個字串的最長公共子串行

解題分析 設兩個序列x y 用lsc x,y 表示最長公共子串行。1.如果xn yn。則該元素一定存在於公共子串行中,所以可化為尋求子問題lsc x 1,y 1 用公式可表示為lsc x,y lsc x 1,y 1 1。2.如果xn yn。則該元素不存在於公共子串行中,所以轉而去尋求兩個子問題,即l...