美文网首页
【动态规划】最长回文子序列lps

【动态规划】最长回文子序列lps

作者: 接骨木go | 来源:发表于2018-03-26 22:51 被阅读0次

腾讯2016实习笔试编程题

所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如“aba”、“c”对于一个字符串,可以通过删除某些字符而变成回文字符串,如“cabebaf”,删除'c'、'e'、‘f’后剩下子串“abba”就是回文字符串。要求,给定任意一个字符串,字符串最大长度1000,计算出最长的回文字符串长度。如“cabebaf”的回文串包括“c”、“aba”、“abba”等,最长回文“abba”长度为4。

输入:字符串
输出:最大的回文字符长度。

示例:
输入:cabbeaf
输出:4

基本思路:
设lps(0,n-1)表示下标0~n-1的子串的最长回文子序列的长度。当str[0]==str[n-1]时,lps(0,n-1)=lps(1,n-2)+2;
当str[0]!=str[n-1]时,lps(0,n-1)=max(lps(0,n-2),lps(1,n-1))。

参考代码
#include<bits\stdc++.h>
using namespace std;
const int MAX = 1010;
int dp[MAX][MAX];

int lps(int n,string str){
    
    memset(dp,0,sizeof(dp));
    for (int i=0;i<n;++i) dp[i][i]=1;
    for (int i=1;i<n;++i){
        for (int j=0;j+i<n;++j){
            if (str[j]==str[j+i]) dp[j][j+i]=dp[j+1][j+i-1]+2;
            else dp[j][j+i]=max(dp[j][j+i-1],dp[j+1][j+i]);
        }
    }
    return dp[0][n-1];
}

int main()
{
    string str;
    while(cin>>str){
        cout<<lps(str.length(),str)<<endl;
    }
 } 

相关文章

  • 【动态规划】最长回文子序列lps

    腾讯2016实习笔试编程题 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如“aba”、“...

  • 证明LPS为字符串与其反转后形成字符串的LCS

    LPS: Longest Palindrome Subsequence 最长回文子序列LCS: Longest C...

  • 最长回文子序列—LPS(Sequence)

    看了一些类似文章发现很多同学连子串,子序列的概念都是混淆的。子序列:sequence,是不必连续的一组字符子串:s...

  • 动态规划9:最长回文子序列

    给定一个字符串s,找到其中最长的回文子序列长度。可以假设s的最大长度为1000。 输入:"bbbab"输出:4一个...

  • 字符串

    1 最长无重复字符子串 2 最长上升子序列(动态规划) 3 最长公共子序列的长度(动态规划) 4 对于一个字符串,...

  • 516. 最长回文子序列

    516. 最长回文子序列 1.想法 image.png我们采用动态规划 1.建模 a.解:将f[n][n]数值填满...

  • DP经典问题代码

    斐波那契数列 (动态规划的递归写法) 数塔问题 (动态规划的递推写法) 最大连续子序列和 最长不下降子序列 最长公...

  • 动态规划算法

    动态规划算法 最长上升子序列

  • 动态规划相关算法合集

    动态规划之最长公共子序列:最长公共子序列[https://mp.weixin.qq.com/s/clPncFZT0...

  • 字符串的几个问题

    1.最长公共子序列2.最长公共子串3.最长回文串4.最长回文序列5.最长递增序列6.最长先增后减序列7.(最短)编...

网友评论

      本文标题:【动态规划】最长回文子序列lps

      本文链接:https://www.haomeiwen.com/subject/hnjdcftx.html