题解 | 合并回文子串

合并回文子串

https://www.nowcoder.com/practice/2f43728b46744546b4ad7f4f0398054f

#include <bits/stdc++.h>
using namespace std;

const int N = 60;
int dp[N][N][N][N];

void solve(){
    
    string str1,str2;
    cin>>str1>>str2;

    int len1 = str1.size();
    str1 = ' ' + str1;
    int len2 = str2.size();
    str2 = ' ' + str2;
	
    memset(dp,0,sizeof dp);

	int ans = 1;
	for(int a = 0;a<=len1;a++){
		for(int i = 1;i+a-1<=len1;i++){
			for(int b = 0;b<=len2;b++){
				for(int j = 1;j+b-1<=len2;j++){
					
					int k1 = i + a -1,k2 = j+b-1;
					if(a+b<=1) dp[i][k1][j][k2] = 1;
					if(str1[i]==str1[k1]){
						dp[i][k1][j][k2] |= dp[i+1][k1-1][j][k2];
					} 
					if(str2[j]==str2[k2]) {
						dp[i][k1][j][k2] |= dp[i][k1][j+1][k2-1];
					}
					if(str1[i]==str2[k2]){
						dp[i][k1][j][k2] |= dp[i+1][k1][j][k2-1];
					} 
					if(str2[j]==str1[k1]){
						dp[i][k1][j][k2] |= dp[i][k1-1][j+1][k2];
					} 
					
					if(dp[i][k1][j][k2])ans = max(ans,a+b);
				}
			}
		}
	} 	

	cout<<ans<<"\n";

}

int main(){
    int t;cin>>t;
    while(t--) solve();
    return 0;
}

如果区间长度只有1,那么该区间回文长度为1,然后判断两个字符串的前缀和后缀是否相等,并且前面是否构造成功,如果有其中一个满足,那么就和答案比大小

#牛客春招刷题训练营#https://www.nowcoder.com/discuss/727521113110073344

全部评论

相关推荐

WhiteAlbum...:学院本2中大厂垂直实习➕acm比赛 秋招0面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务