字符串的交错组成

27 篇文章 0 订阅
25 篇文章 0 订阅

https://www.nowcoder.com/practice/1fdefa4178f7460d93738b28441e1277tpId=101&tqId=33112&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking

题目描述

给定三个字符串str1、str2 和aim,如果aim包含且仅包含来自str1和str2的所有字符,而且在aim中属于str1的字符之间保持原来在str1中的顺序属于str2的字符之间保持原来在str2中的顺序,那么称aim是str1和str2的交错组成。实现一个函数,判断aim是否是str1和str2交错组成,如果是请输出“YES”,否则输出“NO”。

 

输入描述:

输出三行,分别表示三个字符串str1,str2和aim。1≤length(str1),length(str2)≤5000,1≤length(aim)≤10000,length()表示字符串长度。

输出描述:

输出“YES”或者“NO”。(不包含引号)

示例1

输入

AB
12
1AB2

输出

YES

示例2

输入

2019
9102
22001199

输出

NO

备注:

时间复杂度O(n∗m),空间复杂度O(min(n,m))。(n表示字符串str1长度,m表示s字符串tr2长度)
//dp[i][j]的值表示aim[0,i+j-1]能否被s1[0..i-1]和s2[0..j-1]交错组成
#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1,s2,aim;
    cin>>s1>>s2>>aim;
    int m=s1.size();
    int n=s2.size();
    if(m+n!=aim.size()){
        cout<<"NO"<<endl;
        return 0;
    }
    
    vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));
    dp[0][0]=true;
    for(int i=1;i<=m;i++){
        if(s1[i-1]!=aim[i-1]){
            break;
        }
        dp[i][0]=true;
    }
    for(int j=1;j<=n;j++){
        if(s2[j-1]!=aim[j-1]){
            break;
        }
        dp[0][j]=true;
    }
    
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if( (s1[i-1]==aim[i+j-1] && dp[i-1][j]) 
               || (s2[j-1]==aim[i+j-1] && dp[i][j-1]) ){
                dp[i][j]=true;
            }
        }
    }
    if(dp[m][n]){
        cout<<"YES"<<endl;
    }else{
        cout<<"NO"<<endl;
    }

    return 0;
}

//空间待优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值