最长回文串(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;
    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务