查詢兩個字串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] 中較長的字串。這裡要特別注意題目條件,最長的子串是較短輸入字串中最先出現的。
**:
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 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()
**:
3.第三種解法,就是通過暴力解法。根據短字串從最大長度依次遞減,在長字串中查詢是否有匹配的子串,但是這種方法的複雜度是 o(n1*n1*n2),空間複雜度是 o(1), 前面兩種動態規劃的時間複雜度是 o(n1*n2),但空間複雜度是 o(n1*n2)。#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()
**:
#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...