c++中的错误答案

Wrong answer in c++

本文关键字:答案 错误 c++      更新时间:2023-10-16

你会得到一个DNA序列和一些酶。假设一个DNA序列是这样的:ATGCTGCTATGCATGCAGTGACT,并且你得到了可以去除AT和GC序列的酶。因此,您需要首先从DNA中去除所有出现的AT,然后重组DNA并应用下一种酶来去除所有出现GC的情况。问题的结果是,你最终得到的绳子会改造那些没有被这些酶去除的碎片。

输入

输入的第一行由表示酶的数量的整数n组成。第一行有DNA序列。接下来的T行具有输入CCD_ 1。

输出

对于给定的输入DNA序列,输出包含最终重组DNA的单行,该重组DNA是通过从a.中重复去除所有B1、B2、B3…Bn而形成的

在DNA被完全消耗的情况下,打印0表示没有DNA残留。

Constraints
1 <= n <= 10

示例1:

输入:

2
ATACGCATGACGATGCATGCAGCAT
ATA
GC

输出:

CATGACGATATAAT

示例2:输入:

3
ATGCATGCATCGACTCAGCATCAGCATCGACTA
TG
GC
AT

输出:

ACACCGACTCACACGACTA

我的代码:

我试着用c++中的字符串来解决它,我得到了:

在抛出"std::out_of_range"的实例后调用terminatewhat():basic_string::擦除()

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <set>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <stack>
#include <assert.h>
#include <limits.h>
using namespace std;

int main() {
    string str, str1;
    int n;
    scanf("%d", &n);
    cin >> str;
    while (n--) {
        cin >> str1;
        int len = str1.length();int len1=str.length();
        for (int i = 0; i < len1; i++) {
            int found = str.find(str1);
            str.erase(found, found + len);
        }
    }
    cout << str;
    return 0;
}

三个主要问题:

第一,string::erase上的异常超出范围
修复了通过测试发现实际返回值的问题:

if (found!=std::string::npos)

第二,正确搜索。通过跟踪found(它也是size_t而不是int)并从下一个位置进行搜索来修复:

found = str.find(str1,found);

第三,正确使用string::erase
通过使用子字符串的长度进行擦除,而不是length+position:进行修复

str.erase(found,len);

我还没有为您的代码添加任何输入验证。你真的应该考虑自己去做。

最终代码:

(视频)

 #include <string>
 #include <iostream>
 int main()
{
    std::string str;
    std::string str1;
    int n;
    std::cin>>n;
    std::cin>>str;
    while(n--)
    {
        std::cin>>str1;
        int len = str1.length();
        size_t found = 0;
        for(unsigned int i=0;i<str.length();i++)
        {
            found = str.find(str1,found);
            if (found!=std::string::npos)
            {
                str.erase(found,len);
            }
            else
            {
                break;
            }
        }
    }
    std::cout<<(str.length()?str:"0");
    return 0;
}

每个示例输入的idone输出(我在/**/标记之间添加了您的示例输出):

Success time: 0 memory: 3476 signal:0
  CATGACGATATAAT
/*CATGACGATATAAT*/
Success time: 0 memory: 3476 signal:0
  ACACCGACTCACACGACTA
/*ACACCGACTCACACGACTA*/