最長公共字串(動態規劃)

2021-07-08 15:27:52 字數 1068 閱讀 5558

【題目】

給定兩個字串 str1 和 str2,返回兩個字串的最長公共子串。

【舉例】

str1 =「1ad12345cd 」, str2 =「12345ef」。返回「12345」。

【要求】

如果str1 長度為m, str2長度為n,實現時間複雜度為o(m*n),額外空間複雜度

為o(1)的方法。

**實現:

#include #include #include #include #include #include #include using namespace std;

/* 經典的動態規劃,利用dp[i][j]空間複雜度為o(m*n),還可以進行優化

因為dp[i][j]只和dp[i-1][j-1]有關,所以可以按照斜線方向來計算,s

只需要乙個變數就可以計算出所有位置的值

*/char* getsublist(const char* str1, const char* str2)

int rows = 0; //斜線開始位置的行

int cols = strlen(str2) - 1; //斜線開始位置的列

int maxlen = 0; //記錄最大長度

int ends = 0; //最大長度更新的時候,記錄字串結束的位置

int i = 0, j = 0, len = 0;

char* pres = null;

while(rows < strlen(str1))

else

/* 記錄最大值 */

if (len > maxlen)

i++;

j++;

}if(cols > 0) //斜線開始位置列先向左移動

else//列移動到最左之後,行往下移動

}pres = new char[maxlen+1];

memcpy(pres,str1+ends-maxlen+1,maxlen);

pres[maxlen] = '\0';

return pres;

}int main()

動態規劃 最長公共字串

思想 首先通過構造二維陣列,較長字串a作為行,較短字串b作為列。將第一行和第一列初始化全初始化為1,通過遞推式,如果當前兩個字串相等,則為左上角的數字加1,否則為0。找出最大的數字,最大的數字表示公共字串的長度。找出公共字串在字串a的角標,從後往前數公共字串個長度即為公共字串。word a yawi...

最長公共子字串 動態規劃

x y x和y的longest common substring為 長度為2 動態規劃解法 c i j 表示x 0.xi和y 0.yj的最大substringx i yj 的長度,比如 x y c 1 1 1 c 2 2 2 c 3 3 0 c 4 4 1 動態轉移方程為 如果xi yj,則 c i...

最長公共子串 最長公共子串 動態規劃

有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在1000以內 例如 輸入 abcde bcd 輸出 3 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。3 通過查詢出值為1的最長對角線就能找到最長公...