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

腾讯2017暑期实习生编程题(一)----构造回文

2017-02-28 14:32 204 查看

腾讯2017暑期实习生编程题(一)—-构造回文

时间限制:1秒
空间限制:32768K


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

输出需要删除的字符个数。

输入描述:

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


输出描述:

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


输入例子1:

abcda
google


输出例子1:

2
2


分析:回文串的特点是,逆序输出和正序输出是一样的。所以这道题可以从这方面来考虑。如果将此字符串逆序输出,那么两个字符串的最长公共子序列将是最长的回文字符串,那么剩余的值将是要删除的字符个数。求两个字符串的最长公共子序的方法参见我的另一篇博文—-C++实现最长公共子序列和最长公共子串

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int lcs( string &str1,string &str2 )
{

const int len1 = str1.length();
const int len2 = str2.length();

vector< vector<int> > c( len1+1,vector<int>(len2+1,0) );

for( int i=0;i<=len1;++i )
{
for( int j=0;j<=len2;++j )
{
if( !i || !j ){
c[i][j] = 0;
continue;
}

if( str1[i-1] == str2[j-1] )
{
c[i][j] = c[i-1][j-1] + 1;
}
else
{
if( c[i-1][j] > c[i][j-1] )
{
c[i][j] = c[i-1][j];
}
else
{
c[i][j] = c[i][j-1];
}
}
}
}
return c[len1][len2];
}

int main()
{
string str;
vector <string> v;
while( getline(cin,str) &&  !str.empty() )
{
v.push_back(str);
}

for( vector<string>::iterator iter = v.begin(); iter != v.end(); ++iter)
{
string str(*iter);
reverse(str.begin(),str.end());
cout << str.length() - lcs(*iter,str) << endl;
}
return 0;
}


大家有更好的解题思路可以讨论讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  腾讯 编程 数据