c ++中的错误答案

时间:2014-10-08 13:40:25

标签: c++ string algorithm

给你一个DNA序列,几个酶。假设,DNA序列如下: ATGCTGCTATGCATGCAGTGACT ,您将获得可以去除AT和GC序列的酶。因此,您需要首先从DNA中去除所有出现的 AT ,然后重新构建DNA并应用下一个酶来去除所有出现的GC。问题的输出将是你最后改造的那些未被这些酶去除的碎片的字符串。

输入

第一行输入由一个整数n组成,表示酶的数量。第一行具有DNA序列。下一个T行的输入为B1, B2, B3... Bn

输出

对于给定的输入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 ++中的字符串解决它,我得到了:

在抛出&#39; std :: out_of_range&#39;的实例后终止调用 what():basic_string :: erase()

#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;
}

1 个答案:

答案 0 :(得分:2)

三个主要问题:

第一,超出string::erase的范围例外 通过测试修复了find实际返回的值:

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

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

found = str.find(str1,found);

第三,正确使用string::erase 通过使用子串的长度来修复,而不是长度+位置

str.erase(found,len);

我仍未在您的代码中添加任何输入验证。你应该考虑自己这样做。

最终代码:

ideone

 #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*/