算法:最长回文子串长度

来源:互联网 发布:怎么查IP端口开关 编辑:程序博客网 时间:2024/06/06 00:21

动态规划:

最长回文子串:连续+回文
公式
p[i,j] =
1)if(str[i] == str[j]) p[i][j] = 2+p[i+1][j-1]
2)if(str[i]!=str[j]) p[i][j] = max(p[i][j-1], p[i+1][j])
p[i][i] = 1;

需要注意的是,在求解的时候计算的长度由短到长,否则在公式中依赖较短的长度的值不可得会造成错误。//最长回文子串int finddp1(string  str){    int len = str.size();    vector<vector<int> > dp1(len, vector<int>(len,0));    for(int i = 0; i < len; i++)    {        dp1[i][i] = 1;    }    for(int i = 1; i < len; i++)            //串长度    {        for(int j = 0; j+i < len; j++)      //串的起始和结束下标        {            if(str[j] == str[j+i])            {                dp1[j][j+i] = 2 + dp1[j+1][j+i-1];            }            else            {                dp1[j][j+i] = max(dp1[j][j+i-1], dp1[j+1][j+i]);            }        }    }    return dp1[0][len-1];}int main(){    string input;    cin>>input;    printf("%d\n",finddp1(input));    return 0;}

这里写图片描述

0 0