题目描述
给定三个字符串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;
}
//空间待优化