解答
运用的是动态规划的思想,由于是求最长回文字符串。
dp数组定义为:在子串s[i…j]中,最长回文子序列的长度为dp[i][j];
子问题: 所以其子问题可以看作是求短一点长度,例如求dp[i][j],可 以由求其子问题dp[i+1][j-1]的结果算出。所以其子问题即是长度 减去左右两端的字符串的长度。
递推公式: dp[i][j] = dp[i+1][j-1] + 2 s[i] == s[j]
dp[i][j] = max(dp[i+1][j],dp[i][j+1]) s[i] != s[j]
getLength(str):
输入: 一个字符串
输出: 字符串内最长回文字符串的长度
for i <-- length - 1 to 0 do:
dp[i][i] = 1;
for j <-- i+1 to length -1 do:
If(str[i] == str[j]) then:
dp[i][j] = dp[i+1][j-1]+2;
else
dp[i][j] = max(dp[i+1][j],dp[i][j+1])
end
end
return dp[0][len-1];
只有懂得基本原理和协议规范的程序员才能摆脱搬砖码农这个束缚。