字符串拼接
  I0t3qRT6ovZX 2023年11月02日 20 0


字符串拼接

Description

给定3个字符串a, b, c。你的任务是判断c是否可由a, b拼接出来。
c可由a, b拼接则意味着存在一种情况,将c拆分成两个子字符串,这两个子字符串分为等于a, b。注,c在拆分过程中,c中的每个字符只能属于两个子串中的一个。

Input

输入包含多组样例,样例数不超过20。
第一行一个整数T,表示样例数。
接下来3T行,每三行为一组样例。每组样例包含3行,分别为字符串a, b, c(1≤字符串长度≤2×103)。

Output

对于每组输入,输出Yes,如果c可由a, b拼接; No,如果不可拼接。

样例输入

2
abc
def
adebcf
abc
def
abecdf

样例输出

Yes
No

Note: 请注意,字符之间的顺序不能改变。
1.确定状态:dp[i][j]:表示第 1 个字符串的第 i 个字符,第 2 个字符串的第 j 个位置
2.状态转移:dp[i][j]=dp[i][j]||dp[i-1][j];
dp[i][j]=dp[i][j]||dp[i][j-1];

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=2e3+7;
string a,b,c;
int dp[maxn][maxn];
int main()
{
    std::ios::sync_with_stdio(false),cin.tie(0);
    int t;
    cin>>t;
    while(t--){
        memset(dp,0,sizeof dp);
        cin>>a>>b>>c;
        int la=a.size(),lb=b.size(),lc=c.size();
        if(la+lb==lc){
            dp[0][0]=1;
            for(int i=0;i<=la;++i){
                for(int j=0;j<=lb;++j){
                    if(!i && !j) continue;
                    if(i){
                        if(a[i-1] == c[i+j- 1])
                            dp[i][j]=dp[i][j]||dp[i-1][j];
                    }
                    if(j){
                        if(b[j-1]==c[i+j-1])
                            dp[i][j]=dp[i][j]||dp[i][j-1];
                    }
                }
            }
            if(dp[la][lb]) cout<<"Yes"<<'\n';
            else cout<<"No"<<'\n';
        }
        else cout<<"No"<<'\n';
    }
    return 0;
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xlvdqsD183Uk   2023年11月13日   18   0   0 分隔符输出格式ci
I0t3qRT6ovZX