顺便贴一下LCS的图解算法
s1:2 5 7 9 3 1 2
s2:3 5 3 2 8
一. 使用二維陣列
二. 記錄每一格的結果,是由哪一格而來
1. 陣列開頭均設為空
2. S1[i]=S2[j]相同,dp[i][j]则继承左上方向dp[i-1][j-1]的值+1
3. 不相同dp[i][j]则继承 上方與左方中的最大數值
最后整个二維陣列中最大的值,就是s1和s2的最长公共子串长度
那么:
回文串的状态转移方程和LCS 非常类似
if(s[i]==s[j])
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1;
但是本文中 n值大小为5000+,现在我写的程序会MLE O(5000*5000)
,浪费了太多空间则必须用滚动数组进行优化