笔试题之构造回文(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腾讯暑假校招的主要内容,如果未能解决你的问题,请参考以下文章