最长回文子序列

蘑菇街校招题:给定一个字符串,问是否能通过添加一个字母将其变为回文串。

腾讯实习招聘题:对于一个字符串,删去其中某些字符,找到最长回文串。

这两题本质上都是找字符串的最长回文子序列,把当前字符串翻转,然后求翻转字符串和原来字符串的LCS。动归很容易解决。

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<vector>
 5 using namespace std;
 6 int main()
 7 {
 8     string s;
 9     while(cin>>s)
10     {
11         int len=s.size();
12         if(len<=1)
13         {
14             cout<<"YES"<<endl;
15             continue;
16         }
17         vector<int> prev(len+1,0);
18         vector<int> rear(len+1,0);
19         string str(s);
20         reverse(s.begin(),s.end());
21         int i,j;
22         for(i=1;i<=len;i++)
23         {
24             for(j=1;j<=len;j++)
25             {
26                 if(s[i-1]==str[j-1])
27                 {
28                     rear[j]=prev[j-1]+1;
29                 }
30                 else
31                 {
32                     rear[j]=max(rear[j-1],prev[j]);
33                 }
34             }
35             swap(rear,prev);
36         }
37         if(prev[len]>=len-1)
38             cout<<"YES"<<endl;
39         else
40             cout<<"NO"<<endl;
41     }
42     return 0;
43 }
View Code

 

posted @ 2016-04-06 14:28  vaevaevae  阅读(191)  评论(0)    收藏  举报