【題目】
給定兩個字串 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的最長對角線就能找到最長公...