動態規劃 求最長公共子串,最長回文子串

2021-07-05 13:06:51 字數 1378 閱讀 8514

題目 : 給定兩個字串,求出它們之間連續的最長的相同子字串的長度。

eg : fbaabe,ebaabf,連續最長子串長度為4。

注意:求最長回文子串也可以用求最長公共子串來求,只需將字串反轉作為另外乙個字串,回文部分反轉之後不變,然後求lcs(longest common substring)即可。

求最長公共子串通常兩種方法:第一暴力,第二,動態規劃。這裡分別給出。

char* lcs2(char* s1,char* s2)

if (strlen(s1)else

if (strstr(longstr,shortstr) != null)

substr = (char*)malloc(sizeof(char)*(strlen(shortstr)-1));

for (i = strlen(shortstr)-1;i>0;i--)}}

return null;

}

求字串str1,str2的最長公共子串的長度。

定義二元函式函式f(m,n):分別以str1[m],str2[n]結尾的連續公共子串的長度

而對於f(m+1,n+1) 有以下種情況:

1.str1[m+1] != str2[n+1],則有f(m+1,n+1) =0

2.str1[m+1] == str2[n+1],則有f(m+1,n+1) = f(m,n) + 1

另外,

f(0,j) = s1[0] == s2[j] ? 1:0 where (j>=0)

f(i,0) = s1[i] == s2[0] ? 1:0 where (j>=0)

按照上面這個公式,我們用容易寫出這個演算法的實現。

void commonstr(char* s1,char* s2)

for (j=0;jif (s1[0] == s2[j])

b(0,j) = 1;

else

b(0,j) = 0;

}max = 0;

for (i=1;ifor (j=1;jif (s1[i] == s2[j])

else}}

char* result = new

char[len1+1];

strncpy(result,&s1[index-max],max);

result[max] = '\0';

cout

<< "最長子串長度:"

<< max << "最長子串:"

<< result << endl;

#undef b

delete b;

delete result;

}

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

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

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

描述 計算兩個字串的最大公共子串 longest common substring 的長度,字元不區分大小寫。輸入 輸入兩個字串 輸出 輸出乙個整數 樣例輸入 asdfas werasdfaswer樣例輸出 6 參考 這裡的最大公共字串要求的字串是連續的。求字串的方法和求子序列方法類似 當s i t...

最長公共子串 動態規劃

題目 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。思想 動態規劃 步驟 第一步 確定子問題。在這一步重點是分析那些變數是隨著問題規模的變小而變小的,那些變數與問題的規模無關。第二步 確定狀態...