笔试题之构造回文(LCS问题)2017腾讯暑假校招

Posted yinbiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试题之构造回文(LCS问题)2017腾讯暑假校招相关的知识,希望对你有一定的参考价值。

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。


输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.


输出描述:

对于每组数据,输出一个整数,代表最少需要删除的字符个数。


输入例子1:
abcda
google

输出例子1:
2
2

分析:
要求删掉字符最少,也就是最长的回文串,回文串的性质是正反读起来一样,所以我们将当前字符串逆反得到一个新的字符串,然后求得这两个字符串的最长公共子序列的长度
然后字符串的总长度减去最长公共子序列的长度,就是最少需要删除的字符的个数

code:
#include<bits/stdc++.h>
using namespace std;
#define max_v 1005
#define me(a,x) memset(a,x,sizeof(a))
typedef long long LL;
int dp[max_v][max_v];//dp[i][j]表示a0.....ai和b0....bj的LCS长度
char a[max_v],b[max_v];
int main()
{
    while(~scanf("%s",a))
    {
        int n=strlen(a);
        for(int i=n-1,k=0;i>=0;i--)
        {
            b[k++]=a[i];//得到原串的逆反串
        }
        me(dp,0);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(a[i-1]==b[j-1])//因为i,j是从1开始的,所以i-1,j-1
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                }else
                {
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        cout<<n-dp[n][n]<<endl;
    }
    return 0;
}

 

以上是关于笔试题之构造回文(LCS问题)2017腾讯暑假校招的主要内容,如果未能解决你的问题,请参考以下文章

说一下前天腾讯实习的笔试题--字符串回文问题(动态规划)

2018腾讯校招软件开发岗在线笔试题

笔试题81. 腾讯2017暑期实习生笔试题

腾讯校招前端开发笔试初试总结

2017腾讯秋招笔试题之编码

2017腾讯秋招笔试题之编码