牛客 合并回文子串 最长回文子串 最长回文子序列

题目链接:https://ac.nowcoder.com/acm/problem/13230

思路: 区间dp  只有四种情况 讨论  注意处理边界问题   把0的处理好后 1的也好了 2的不用处理 因为不同于单个字符串

https://ac.nowcoder.com/discuss/391086 题解

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define pb push_back
 4 using namespace std;
 5 const int maxn=1e5+10;
 6 const int mod=1e9+7;
 7 int dp[55][55][55][55];
 8 
 9 
10 int main()
11 {
12     ios::sync_with_stdio(0);
13     cin.tie(0);
14     int t;
15     cin>>t;
16     while(t--)
17     {
18         string a,b;
19         cin>>a>>b;
20         memset(dp,0,sizeof(dp));
21         int na=a.size(),nb=b.size();
22         int ans=1;
23         for(int lena=0;lena<=na;lena++)
24         {
25             for(int lenb=0;lenb<=nb;lenb++)
26             {
27                 for(int i=1;i+lena-1<=na;i++)
28                 {
29                     for(int x=1;x+lenb-1<=nb;x++)
30                     {
31                         int j=i+lena-1,y=x+lenb-1;
32                         if(lena+lenb<=1)
33                         {
34                             dp[i][j][x][y]=1;
35                             continue;
36                         }
37                         if(a[i-1]==a[j-1]&&dp[i+1][j-1][x][y]&&lena>1)
38                             dp[i][j][x][y]=1;
39                         if(a[i-1]==b[y-1]&&dp[i+1][j][x][y-1]&&lena&&lenb)
40                             dp[i][j][x][y]=1;
41                         if(b[x-1]==a[j-1]&&dp[i][j-1][x+1][y]&&lena&&lenb)
42                             dp[i][j][x][y]=1;
43                         if(b[x-1]==b[y-1]&&dp[i][j][x+1][y-1]&&lenb>1)
44                             dp[i][j][x][y]=1;
45                         if(dp[i][j][x][y])
46                             ans=max(ans,lena+lenb);
47                     }
48                 }
49             }
50         }
51         cout<<ans<<'\n';
52     }
53 
54 
55 
56 }
View Code

 

 

最长回文子串 n^2  ###K //K

 1 // 最长回文子串 n^2
 2 class Solution {
 3 public:
 4     int dp[1111][1111];
 5     string longestPalindrome(string s) {
 6         int n=s.size();
 7         for(int i=1;i<=n;i++)
 8             dp[i][i]=1;
 9         int max1=1,p=0;
10         for(int len=2;len<=n;len++)
11         {
12             for(int i=1;i+len-1<=n;i++)
13             {
14                 int endx=i+len-1;
15                 if(s[i-1]==s[endx-1]&&(dp[i+1][endx-1]||len==2))//特判长度2的
16                     dp[i][endx]=1;
17                 if(dp[i][endx])
18                 {
19                     if(len>max1)
20                     {
21                         max1=len;
22                         p=i-1;
23                     }
24                 }
25             }
26         }
27         return s.substr(p,max1);
28     }
29 };
View Code

 

最长回文子序列 n^2 ###K //K

 1 // 最长回文子序列
 2 class Solution {
 3 public:
 4     int dp[1111][1111];
 5     int longestPalindromeSubseq(string s) {
 6         int n=s.size();
 7         for(int i=1;i<=n;i++)
 8             dp[i][i]=1;//记得初始化
 9         for(int len=2;len<=n;len++)
10         {
11             for(int i=1;i+len-1<=n;i++)
12             {
13                 int endx=i+len-1;
14                 if(s[i-1]==s[endx-1])
15                     dp[i][endx]=dp[i+1][endx-1]+2;
16                 else
17                     dp[i][endx]=max(dp[i+1][endx],dp[i][endx-1]);
18             }
19         }
20         return dp[1][n];
21 
22     }
23 };
View Code

 

posted @ 2020-12-19 01:02  canwinfor  阅读(11)  评论(0)    收藏  举报