您的位置:首页 > 编程语言

腾讯17年实习生编程试题--构造回文

2016-05-30 16:38 260 查看

题目描述:

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

输出需要删除的字符个数


输入描述:


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


输出描述:


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


输入例子:

abcda
google



输出例子:

2
2

实现思想:

首先保存s字符串,之后再保存其rs相反的字符串。对其求最大子序列和,则结果就是回文串。

源代码实现:

#include <bits/stdc++.h>

using namespace std;

const int MAXN=1010;

int dp[MAXN][MAXN];

class Solution

{

public:

   int solve(string &s)

   {

       return s.length()-getLCS(s);

   }

   int getLCS(string &s1)

   {

       string s2(s1);

       reverse(s2.begin(),s2.end());

       int len=s1.length();

       memset(dp,0,sizeof dp);

       for(int i=0;i<len;++i)

       {

           for(int j=0;j<len;++j)

           {

               if(s1[i]==s2[j])

                   dp[i+1][j+1]=dp[i][j]+1;

               else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);

           }

       }

       return dp[len][len];

   }

};

int main()

{

   string s;

   while(cin>>s)

   {

       Solution solution;

       cout<<solution.solve(s)<<endl;

   }

   return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: