输出三行,分别表示三个字符串str1,str2和aim。,
表示字符串长度。
输出“YES”或者“NO”。(不包含引号)
AB 12 1AB2
YES
2019 9102 22001199
NO
时间复杂度,空间复杂度
。(n表示字符串str1长度,m表示s字符串tr2长度)
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1,s2,aim;
cin>>s1>>s2>>aim;
if (aim.size() != s1.size() + s2.size())
{
cout<< "NO";
return 0;
}
string ls = s1.size() >= s2.size() ? s1 : s2;
string ss = s1.size() < s2.size() ? s1 : s2;
vector<bool>dp(ss.size() + 1);
dp[0] = true;
for (int i = 1; i <= ss.size(); i++){
if (ss[i - 1] != aim[i - 1])
break;
dp[i] = true;
}
for (int i = 1; i <= ls.size(); i++){
dp[0] = dp[0] && ls[i - 1] == aim[i - 1];
for (int j = 1; j <= ss.size(); j++){
if ((ls[i - 1] == aim[i + j - 1] && dp[j]) || (ss[j - 1] == aim[i + j - 1] && dp[j - 1]))
dp[j] = true;
else
dp[j] = false;
}
}
if(dp[ss.size()])
cout<< "YES";
else
cout<< "NO";
return 0;
} #include <bits/stdc++.h>
using namespace std;
bool F(string s, string aim){
int n = s.length(), m = aim.length();
for(int i=0,j=0;i<n;){
if(s[i]==aim[j]){
i++;
j++;
}else
j++;
if(j==m && i<n)
return false;
}
return true;
}
int main(){
string s1, s2, aim;
cin>>s1>>s2>>aim;
if(F(s1, aim) && F(s2, aim))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
} import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s1 = sc.nextLine();
String s2 = sc.nextLine();
String s3 = sc.nextLine();
int a = s1.length(), b = s2.length(), c = s3.length();
if (a + b != c) {
System.out.print("NO");
} else if (func(s1, s2, s3)) {
System.out.print("YES");
} else {
System.out.print("NO");
}
}
public static boolean func(String s1, String s2, String s3) {
boolean[][] f = new boolean[s1.length() + 1][s2.length() + 1];
f[0][0] = true;
for (int i = 1; i <= s1.length(); i++) {
if (s1.charAt(i - 1) == s3.charAt(i - 1)) {
f[i][0] = true;
} else {
break;
}
}
for (int j = 1; j <= s2.length(); j++) {
if (s2.charAt(j - 1) == s3.charAt(j - 1)) {
f[0][j] = true;
} else {
break;
}
}
for (int i = 1; i <= s1.length(); i++) {
for (int j = 1; j <= s2.length(); j++) {
f[i][j] = (f[i -1][j] == true && s1.charAt(i - 1) == s3.charAt(i + j - 1)) || (f[i][j -1] == true && s2.charAt(j - 1) == s3.charAt(i + j - 1));
}
}
return f[s1.length()][s2.length()];
}
} java 100%import java.io.*;
/**
此题是考察递归转化为动态规划。
如果能够想到aim的最后一个字符必须要和str1、str2中的一个字符串的最后一个字符相同的话就可以很容易写出递归。
此时递归形如helper(char[] str1, i1, char[] str2, i2), 表示判断str1中索引i1及以前的字符与str2中i2及以前的字符能否交错组成aim中索引i1+i2+1及以前的字符。
这时就能够容易看出如何设置dp数组,dp[i][j]与dp[i-1][j]和dp[i][j-1]相关。
再转化为一维的dp即可。
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
char[] arr1 = bf.readLine().toCharArray();
char[] arr2 = bf.readLine().toCharArray();
char[] aim = bf.readLine().toCharArray();
bf.close();
if (aim.length != arr1.length + arr2.length) {
System.out.println("NO");
} else if (helper(arr1, arr2, aim)) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
public static boolean helper(char[] arr1, char[] arr2, char[] aim) {
char[] temp;
if (arr2.length > arr1.length) {
temp = arr2;
arr2 = arr1;
arr1 = temp;
}
boolean dp[] = new boolean[arr2.length + 1];
dp[0] = true;
for (int i = 1; i < arr2.length + 1; i++) {
dp[i] = aim[i - 1] == arr2[i - 1] && dp[i - 1];
}
for (int i = 1; i < arr1.length + 1; i++) {
for (int j = 0; j < arr2.length + 1; j++) {
if (j == 0) {
dp[0] = dp[0] && arr1[i - 1] == aim[i - 1];
} else {
dp[j] = (arr1[i - 1] == aim[i + j - 1] && dp[j]) || (arr2[j - 1] == aim[i + j - 1] && dp[j - 1]);
}
}
}
return dp[arr2.length];
}
}