Palindromic Subsequence |
A Subsequence is a sequence obtained by deleting zero or more characters in a string. A Palindrome is a string which when read from left to right, reads same as when read from right to left. Given a string, find the longest palindromic subsequence. If there are many answers to it, print the one that comes lexicographically earliest.
Constraints
- Maximum length of string is 1000.
- Each string has characters `a' to `z' only.
Input
Input consists of several strings, each in a separate line. Input is terminated by EOF.
Output
For each line in the input, print the output in a single line.
Sample Input
aabbaabb computer abzla samhita
Sample Output
aabbaa c aba aha
求最长回文子串
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
const int MAXN=1111;
int dp[MAXN][MAXN];
char str1[MAXN],str2[MAXN];
string ans[MAXN][MAXN];
int main()
{
int l,i,j;
while(scanf("%s",str1+1)!=EOF)
{
l=strlen(str1+1);
for(i=1;i<=l;i++)
{
str2[l+1-i]=str1[i];
}
memset(dp,0,sizeof(dp));
for(i=1;i<=l;i++)
{
for(j=1;j<=l;j++)
{
if(str1[i]==str2[j])
{
ans[i][j]=ans[i-1][j-1]+str1[i];
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
if(dp[i-1][j]>dp[i][j-1])
{
dp[i][j]=dp[i-1][j];
ans[i][j]=ans[i-1][j];
}
else if(dp[i-1][j]<dp[i][j-1])
{
dp[i][j]=dp[i][j-1];
ans[i][j]=ans[i][j-1];
}
else
{
dp[i][j]=dp[i-1][j];
if(ans[i-1][j]>=ans[i][j-1])
{
ans[i][j]=ans[i][j-1];
}
else
{
ans[i][j]=ans[i-1][j];
}
}
}
}
}
string s3=ans[l][l];
// cout<<s3<<endl;
int n=dp[l][l];
if(n%2)
{
for(i=0;i<(n-1)/2;i++)
cout<<s3[i];
for(i=(n-1)/2;i>=0;i--)
cout<<s3[i];
}
else
{
for(i=0;i<n/2;i++)
cout<<s3[i];
for(i=n/2-1;i>=0;i--)
cout<<s3[i];
}
cout<<endl;
}
return 0;
}