【问题标题】:Similar solutions but different answers类似的解决方案但不同的答案
【发布时间】: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;
}

问题链接:https://www.codechef.com/problems/NAME2

【问题讨论】:

  • 不知道为什么您认为您的解决方案和编辑解决方案相似。例如,您的代码有两个循环,而编辑解决方案只有一个。
  • 当你去编辑你会发现方法是相似的......discuss.codechef.com/t/name2-editorial/2022
  • 我真的不认为这些方法是相似的。您的代码的逻辑很难理解,但我正在尝试找到一个示例来说明它为什么不起作用。

标签: c++ string c-strings


【解决方案1】:

只需更改 pos=j+1 而不是 pos=j 即可得到正确答案。那么代码就会变得类似于社论中的伪代码。谢谢大家的回答。

【讨论】:

    【解决方案2】:

    您的代码在输入 AA BAB 时产生了错误的结果,因为它没有考虑到您需要在第二个字符串中包含两个 A

    您可以通过将pos=j; 更改为pos=j+1; 来解决它,但我不确定。

    但是,您的代码和编辑代码之间确实没有相似之处。即使使用我建议的修复方法(如果它确实有效),您的代码显然比编辑代码效率低,因为它会重复扫描输入字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2013-07-19
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多