最长回文串(C++)
最长回文子串
http://www.nowcoder.com/questionTerminal/b4525d1d84934cf280439aeecc36f4af
这题的思路采用动态规划
设计好dp数组的填充顺序既可以解出来,下面以("cbc",3)为案例演示一遍:
设dp[i][j]的值表示字串l(i<=pos<=j)是否是回文串.
1.显然单个字符是回文串,因此dp[i][i] = 1;
2.dp[i][i+1]的值与s[i]==s[j]是否成立有关;
3.dp[i][j]与(dp[i+1][j-1] == 1 && A[i] == A[j])是否成立有关;
1.设置dp[3][3],不用初始化。
(一)
1##
#1#
##1
(二)
10#
#10
##1
(三)
101
#10
##1
每次循环填充一条对角线,完成之后,寻找j-i+1的最大值即得到问题的解。
class Solution { public: int getLongestPalindrome(string A, int n) { // write code here int dp[n][n], l, i; for(l = 0; l < n; l++){ for(i = 0; i < n - l; i++){ int j = i + l; if(i == j) dp[i][j] = 1; else if(j == i + 1 && A[i] == A[j]) dp[i][j] = 1; else{ if(dp[i+1][j-1] == 1 && A[i] == A[j]) dp[i][j] = 1; else dp[i][j] = 0; } } } int ans = 1, temp=0; for(int i = 0; i < n; i++){ for(int j = i; j < n; j++){ if(dp[i][j] == 1) temp = j - i + 1; ans = ans >= temp ? ans : temp; } } return ans; } };