OR18. 字符混编
描述
A、B和C。如果C包含且仅包含来自A和B的所有字符,而且在C中属于A的字符之间保持原来在A中的顺序,属于B的字符之间保持原来在B中的顺序,那么称C是A和B的混编。实现一个函数,判断C是否是A和B的混编。
给定三个字符串A,B和C,及他们的长度。请返回一个bool值,代表C是否是A和B的混编。保证三个串的长度均小于等于100。
"ABC",3,"12C",3,"A12BCC",6
返回:true
C++ 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2021-12-04
class Mixture { public: bool chkMixture(string A, int n, string B, int m, string C, int v) { // write code here vector<vector<bool>>dp(n+1,vector<bool>(m+1,false)); dp[0][0]=true; for(int i=1;i<=n;i++){ if(A[i-1]!=C[i-1]){ break; } dp[i][0]=true; } for(int j=1;j<=m;j++){ if(B[j-1]!=C[j-1]){ break; } dp[0][j]=true; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(dp[i-1][j] && (A[i-1]==C[i+j-1]) || (dp[i][j-1]&&(B[j-1]==C[i+j-1]))){ dp[i][j]=true; } } } return dp[n][m]; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 476KB, 提交时间: 2020-10-31
class Mixture { public: bool chkMixture(string A, int n, string B, int m, string C, int v) { int i,j; bool res=false; if(n+m<=v) { vector<vector<bool>> dp(n+1,vector<bool>(m+1,false)); dp[0][0]=true; for(i=1;i<=n&&dp[i-1][0];i++) dp[i][0]=(A[i-1]==C[i-1]); for(i=1;i<=m&&dp[0][i-1];i++) dp[0][i]=(B[i-1]==C[i-1]); for(i=1;i<=n;i++) for(j=1;j<=m;j++) dp[i][j]=(dp[i-1][j]&&(A[i-1]==C[i+j-1]))|| (dp[i][j-1]&&(B[j-1]==C[i+j-1])); res=dp[n][m]; } return res; } };