【发布时间】:2020-11-17 14:17:55
【问题描述】:
我在解决一个问题时遇到了困难,我们必须检查一个字符串是否是另一个字符串的子序列。
只有当 M 是 W 的子序列或 W 是 M 的子序列时,才允许名为 M 的男人与名为 W 的女人结婚。
如果A可以通过删除B的一些元素而不改变其余元素的顺序来获得,则称A是B的子序列。
示例 -
john 和 johanna 将给出“YES”作为输出
kayla 和 jayla 将给出“NO”作为输出
johanna 和 john 将给出“YES”作为输出
我的代码是:
#include <iostream>
#include<string>
using namespace std;
bool checksub(string a, string b)
{
int pos=0;
for(int i=0; i<a.size(); i++)
{
int flag=0;
for(int j=pos; j<b.size(); j++)
{
if(b[j]==a[i])
{
flag=1;
pos=j;
break;
}
}
if(flag==0)
{
return false;
}
}
return true;
}
int main() {
// your code goes here
int t;
cin>>t;
while(t--)
{
string a,b;
cin>>a>>b;
if(a.size()==b.size())
{
if(a==b)
{
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;}
}
else if(a.size()>b.size()){
if(checksub(b,a))
{
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}else{
if(checksub(a,b))
{
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
}
return 0;
}
问题的社论使用了类似的方法。谁能告诉我我的代码有什么问题?
编辑解决方案如下:
#include <cstdio>
char M[25005], W[25005];
bool contains(const char *A, const char *B){
while(*A){
if(*B==*A)
B++;
A++;
}
return !*B;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%s %s", M, W);
puts(contains(M, W) || contains(W, M) ? "YES" : "NO");
}
return 0;
}
【问题讨论】:
-
不知道为什么您认为您的解决方案和编辑解决方案相似。例如,您的代码有两个循环,而编辑解决方案只有一个。
-
当你去编辑你会发现方法是相似的......discuss.codechef.com/t/name2-editorial/2022
-
我真的不认为这些方法是相似的。您的代码的逻辑很难理解,但我正在尝试找到一个示例来说明它为什么不起作用。