最长回文字符串求解

摘要

什么是回文? 回文是一个正读和反读都相同的字符串,例如,“aba” 是回文,而 “abc” 不是。

解决方案

  1. 求反
  2. 暴力求解
  3. 动态规划
  4. 中心扩散
  5. Manacher 算法

动态规划代码实现

下面是我用C语言实现的动态规划算法

char * longestPalindrome(char * s){
    
    int startP = 0, maxLen = 0;
    int sLen = strlen(s);
    bool **p;
    p = (bool**)malloc(sizeof(bool*)*sLen);
    
    for (int i = 0; i < sLen; i++)
    {
        p[i] = (bool*)malloc(sizeof(bool)*sLen);
    }
    
    //求解p[0,3],必须先求解p[1,2],所以用的是p[j][i]循环
    for (int i = 0; i < sLen; i++)
    {
        for (int j = 0; j < sLen - i; j++)
        { 
            if (i == 0)
                p[j][j+i] = 1;
            else if (i == 1)
                p[j][j+i] = (s[j]==s[j+1]) ? 1 : 0;
            else 
                p[j][j+i] = (p[j+1][j+i-1]) && (s[j]==s[j+i]) ? 1 : 0;
            
            if ((p[j][j+i]) && (i+1 > maxLen))
            {
                maxLen = i + 1;
                startP = j;
            }
        }
    }
    
    free(p);
    
    char *str = (char*)malloc(sizeof(char)*(maxLen+1));
    
    for (int i = 0; i<maxLen; i++)
    {
        str[i] = s[startP+i];
    }
    str[maxLen] = '\0';
    
    
    return str;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值