PAT (Advanced) 1040. Longest Symmetric String (25)

原题:1040. Longest Symmetric String (25)



解题思路:

动态规划。规定两个坐标i, j,dp[i][j]表示从i到j是否为对称字符串, s[i] != s[j] 时,肯定不是, s[i] == s[j]时,若当前子串长度小于3,或者dp[i+1][j-1]是1,则dp[i][j] = 1。

注意:对称字符串应当从短到长判断,所以遍历顺序如代码所示。

事实上,manacher算法可以把时间优化到O(n), 不过此处dp效率足够。


代码如下:

#include
#include
#include
using namespace std;
const int maxn = 1000 + 5;

int dp[maxn][maxn];


int main()
{
    char s[maxn];
    while(fgets(s, maxn, stdin))
    {
        memset(dp, 0, sizeof(dp));
        int n = strlen(s);
        int maxl = 0;
        for(int i = n-1; i >= 0; i--) //注意顺序
            for(int j = i; j < n; j++)
                if(s[i] == s[j] && (j - i + 1 < 3 || dp[i+1][j-1]))
                {
                    dp[i][j] = 1;
                    maxl = max(maxl, j-i+1);
                }
        printf("%d\n", maxl);
    }
    return 0;
}

你可能感兴趣的:(PAT)