最长回文子序列
蘑菇街校招题:给定一个字符串,问是否能通过添加一个字母将其变为回文串。
腾讯实习招聘题:对于一个字符串,删去其中某些字符,找到最长回文串。
这两题本质上都是找字符串的最长回文子序列,把当前字符串翻转,然后求翻转字符串和原来字符串的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 }
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号