給定兩個字串,求最大公共字串的長度,長度小於1000
分為兩種問題:要求計算連續最長字串的長度;或者不連續
如下按照尋找連續的字串理解
輸入:
1111hello2222
1133hello444
輸出:
5
暴力解法:使用兩個for迴圈,用第乙個字串依次去匹配第二個,不斷更新最大字串長度
dp:建立二維陣列 dp[n][n] ,令dp[i][j] 表示str1[0...i]和str2[0...j]中連續相等最大字串的長度,不斷更新ans
當str1[i]!=str2[j],令dp[i][j]==0;
當str1[i]==str2[j],dp[i][j]=dp[i-1][j-1]+1;
對於數字的第一行和第一列,由於最長的公共字串長度為1,所以只要出現字元相等,就令n=1
#include #include #include #include using namespace std;
const int n = 1000;
int dp[n][n] = ;
int main()
else if(i == 0 || j == 0)
else}}
}cout << ans << endl;
return 0;
}
最大公共字串
簡單dp問題 設兩個字串s1,s2,假設dp i j 代表到s1的第i個字元及s2的第j個字元時,最大公共字串的數目 那麼 if s1 i s2 j dp i j d i 1 j 1 1 else dp i j 0 如下 dp二維陣列空間是可以優化的,可以變成一位陣列.dp是個二維矩陣,舉例如下 a...
最大公共字串
最簡單的方法就是依次比較,以某個串為母串,然後生成另乙個串的所有長度的子串,依次去母串中比較查詢,這裡可以採用先從最長的子串開始,減少比較次數,但是複雜度依然很高!然後重新看一下這個問題,我們建立乙個比較矩陣來比較兩個字串str1和str2 定義lcs i,j 當str1 i str2 j 時lcs...
最大公共字串
a i 1 j 1 1最大公共子串長度問題就是 求兩個串的所有子串中能夠匹配上的最大長度是多少。比如 abcdkkk 和 baabcdadabc 可以找到的最長的公共子串是 abcd 所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的...