最长回文字符串

动态规划

采用动态规划法判断子串是否是回文。开辟一个P[i][j]用来表示str[i..j]是否为回文,P[i][j]的状态转移方程如下:

  1. 当i==j时,P[i][j]=true

  2. 当i+1==j时,P[i][j]=str[i]==str[j]

  3. 其他,P[i][j]=P[i+1][j-1]&&(str[i]==str[j])

那么P[i][j]中j-i+1最大的且值为true的就是最长回文子串。这样,这个方法的时间复杂度为O(n^2),空间复杂度为O(n^2)。比暴力法有很大的改进。

void findMaxLCS(char *pStr,int nLen)

{

    bool** pFlag = new bool* [nLen];

    for (int index=0; index<nLen; index++) {

        pFlag[index] = new bool[nLen];

    }

    for (int index=0; index<nLen; index++) {

        pFlag[index][index] = true;

    }

    

    for (int nCurLen = 2; nCurLen<=nLen; nCurLen++)

        for (int i=0; i<nLen-nCurLen+1; i++) {

            int j=nCurLen+i-1;

            if (nCurLen==2) {

                pFlag[i][j] = (pStr[i]==pStr[j]);

            }

            else{

                pFlag[i][j] = (pStr[i]==pStr[j]&&pFlag[i+1][j-1]);

            }

        }

    int nMaxLen = 0;

    int nStart = 0;

    for (int i=0; i<nLen; i++) {

        for (int j=0; j<nLen; j++) {

            if (pFlag[i][j]&&(j-i)>nMaxLen) {

                nMaxLen = j-i;

                nStart = i;

            }

            std::cout<<pFlag[i][j];

        }

        std::cout<<std::endl;

    }

    for (int i=0; i<=nMaxLen; i++) {

        std::cout<<pStr[nStart+i];

    }

    std::cout<<std::endl;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值