输出三行,分别表示三个字符串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]; } }