首页 > 其他分享 >合并回文字符串

合并回文字符串

时间:2022-12-07 17:23:29浏览次数:60  
标签:合并 l2 && l1 字符串 dp 回文

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

题目描述

输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。
我们定义字符串的价值为其最长回文子串的长度(回文串表示从正反两边看完全一致的字符串,如"aba"和"xyyx")。
需要求出所有可能的C中价值最大的字符串,输出这个最大价值即可

输入描述

第一行一个整数T(T ≤ 50)。
接下来2T行,每两行两个字符串分别代表A,B(|A|,|B| ≤ 50),A,B的字符集为全体小写字母。

输出描述

对于每组数据输出一行一个整数表示价值最大的C的价值。

示例

输入

2
aa
bb
a
aaaabcaa

输出

4
5

分析

本题采用区间dp。
给出转移方程:
设dp[i][j][k][l] 若a[i-1]到a[j-1] 和 b[k-1]到b[l-1] 所组成的字符串是回文则其值为1,否则为2。

  • dp[i][j][k][l]=dp[i+1][j-1][k][l] (a[i]==a[j] && i<j)
  • dp[i][j][k][l]=dp[i][j][k+1][l-1] (b[k]==b[l] && k<l)
  • dp[i][j][k][l]=dp[i+1][j][k][l-1] (a[i]==b[l] && i<=j && k<=l)
  • dp[i][j][k][l]=dp[i][j-1][k+1][l] (a[j]==b[k] && i<=j && k<=l)

初始化:
单独一个字符显然的回文的,没有字符我们也认为它是回文的(结合转移方程)。
因此,区间长度分别设为l1,l2。初始化的条件显然 l1+l2<=1 则dp=1
另外:
注意for循环的设置。
本题中的判断为几个并列的if,因此采用了同或,任一条件触发1,即为1。

AC代码


#include <string>
#include <iostream>
#include <cstring>
using namespace std;
 
#define maxn 52
int dp[maxn][maxn][maxn][maxn];
 
int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        memset(dp,0,sizeof(dp));
        string a, b;
        cin >> a >> b;
        int max = 0;
        for (int l1 = 0; l1 <= a.size(); l1++)  //枚举长度
        {
            for (int l2 = 0; l2 <= b.size(); l2++)  //枚举长度
            {
                for (int i = 1, j = l1; j <= a.size(); i++, j++)    //枚举起点
                {
                    for (int k = 1, l = l2; l <= b.size(); k++, l++)    //枚举终点
                    {
                        if (l1 + l2 <= 1)   //初始化 单个字符 空 均初始化为1
                        {
                            dp[i][j][k][l] = 1;
                        }
                        else
                        {
                            if (a[i - 1] == a[j - 1] && l1 > 1)
                                dp[i][j][k][l] |= dp[i + 1][j - 1][k][l];
                            if (b[k - 1] == b[l - 1] && l2 > 1)
                                dp[i][j][k][l] |= dp[i][j][k + 1][l - 1];
                            if (l1 && l2)
                            {
                                if (a[i - 1] == b[l - 1])
                                    dp[i][j][k][l] |= dp[i + 1][j][k][l - 1];
                                if (a[j - 1] == b[k - 1])
                                    dp[i][j][k][l] |= dp[i][j - 1][k + 1][l];
                            }
                        }
 
                        if (dp[i][j][k][l])
                            max = max > l1 + l2 ? max : l1 + l2;
                    }
                }
            }
        }
        cout << max << endl;
    }
    return 0;
}

标签:合并,l2,&&,l1,字符串,dp,回文
From: https://www.cnblogs.com/kongaobo/p/16963676.html

相关文章

  • KMP算法详解-字符串匹配
    1.什么是KMP是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP2.KMP的用处KMP主要用于字符串匹配。KMP的主要思想是当出现字符串不匹......
  • python字符串常用方法汇总
    常用方法如下:str="mynameis{name}andmyageis{age}"#统计字符串的长度print(len(str))#格式化输出也可当切片用的方式print(str.format(name="ming",ag......
  • Java数组和字符串的相互转换
    Java数组和字符串的相互转换字符串转换为数组JavaString类中的toCharArray()方法将字符串转换为字符数组,具体代码如下所示。Stringstr="123abc";char[]arr=......
  • Asp.Net 排出过滤特殊字符串
      safe_360.csusingSystem;usingSystem.Collections.Generic;usingSystem.Text.RegularExpressions;usingSystem.Web;///<summary>///safe_360的摘要说......
  • FFmpeg合并视频和音频文件
    使用IDM下载Bilibili的视频会出现音视频分离的问题,通常文件大的是视频(没有声音),文件小的是单独的音频。将两个文件都下载下来后,可以使用FFmpeg将其合并成一个视频文件。首......
  • XSD 字符串 数据类型概述
    字符串数据类型用于可包含字符串的值。字符串数据类型(StringDataType)字符串数据类型可包含字符、换行、回车以及制表符。下面是一个关于某个scheme中字符串声明的例子:<x......
  • 题目:剑指Offer58-II.左旋转字符串
    题目:剑指Offer58-II.左旋转字符串力扣题目链接(opensnewwindow)字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操......
  • Python实验报告——第5章 字符串及正则表达式
    实例01:使用字符串拼接输出一个关于程序员的笑话 在IDLE中创建一个名称为programmer_splice.py的文件,然后在该文件中定义两个字符串变量,分别记录两名程序说的话,再将......
  • js 字符串与ArrayBuffer互转
    1.情景展示在js当中,如何将字符串转成ArrayBuffer?如何将ArrayBuffer转成字符串?2.字符串转ArrayBuffer/***将类型化数组转字符串Int8Array:8位有符号整数,长度1个字......
  • 1796.second-largest-digit-in-a-string 字符串中第二大的数字
    问题描述1796.字符串中第二大的数字解题思路遍历就好了代码classSolution{public:intsecondHighest(strings){intfirst=-1;intseco......