C++ c+中的错误答案+;

C++ c+中的错误答案+;,c++,string,algorithm,C++,String,Algorithm,你得到了一个DNA序列和一些酶。假设一个DNA序列是这样的:ATGCTGCTAGCATGCAGTGATCT,你得到的酶可以去除AT和GC序列。因此,您需要首先从DNA中去除所有出现的AT,然后重组DNA并应用下一种酶去除所有出现的GC。问题的结果将是你最终得到的字符串,它将重组那些没有被这些酶去除的片段 输入 第一行输入由一个整数n组成,表示酶的数量。第一行有DNA序列。接下来的T行有输入B1、B2、B3。。。Bn 输出 对于给定的输入DNA序列,输出一条包含最终重组DNA的线,该DNA是通过重

你得到了一个DNA序列和一些酶。假设一个DNA序列是这样的:ATGCTGCTAGCATGCAGTGATCT,你得到的酶可以去除AT和GC序列。因此,您需要首先从DNA中去除所有出现的AT,然后重组DNA并应用下一种酶去除所有出现的GC。问题的结果将是你最终得到的字符串,它将重组那些没有被这些酶去除的片段

输入

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

输出

对于给定的输入DNA序列,输出一条包含最终重组DNA的线,该DNA是通过重复移除所有B1、B2、B3的出现而形成的。。。Bn来自A

如果DNA被完全消耗,打印0表示没有剩余的DNA

Constraints

1 <= n <= 10
输出:

CATGACGATATAAT
ACACCGACTCACACGACTA
示例2: 输入:

输出:

CATGACGATATAAT
ACACCGACTCACACGACTA
我的代码:

我尝试用C++中的String来解决它,我得到:

在抛出'std::out_of_range'的实例后调用terminate what():基本字符串::擦除()

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
str序列,str1;
int n;
scanf(“%d”和“&n”);
cin>>str;
而(n--){
cin>>str1;
int len=str1.length();int len1=str.length();
对于(int i=0;i
第一,在
string::erase上出现超出范围的异常
通过测试find实际返回的值修复:

if (found!=std::string::npos)
第二,正确搜索。 通过跟踪已找到的
(它也是
size\u t
而不是
int
)并从下一个位置搜索来修复:

found = str.find(str1,found);
第三,正确使用
string::erase

通过使用要擦除的子字符串的长度(而不是长度+位置)进行修复:

我还没有给你的代码添加任何输入验证。你应该自己考虑一下

最终代码:

()


scanf
是危险的,使用它而不检查返回值以确定它是否成功是非常糟糕的。
cin>>n
有什么问题吗?您应该检查从
cin
读取的所有结果。每次我看到堆栈溢出问题时都会说“我的程序读取输入不工作”我发现在读中绝对没有错误检查。这让我很难过。你也没有处理N的约束。你有没有理由将C++流输入和旧的C风格输入与<代码> SCANF混合?为什么所有的头文件都包含?你不使用大多数的功能。(你所需要的就是
,而
就是你坚持使用
scanf
)。如果你的字符串没有找到,你就不管怎么做:
str.erase(found,found+len);
。仍然是错误的答案。。我在最后加上了“如果DNA完全消耗,打印0以表明没有剩下DNA。”
如果((str.length())!=0)std::coutYes!我看到:)@Baldrickk在问题中写道,你需要先从DNA中删除所有AT,然后重组DNA,然后应用下一种酶来删除所有GC。还有其他想法吗?@Davidjones如果你对我关于不同算法的建议发表评论(减少擦除),然后您将构建新字符串并将其作为每个子字符串的进程交换给原始字符串。这将减少分配=faster@Baldrickk:如果你想要一个更快的算法,我建议如下:当发现匹配时,用空格覆盖它,这不会改变序列字符串的长度,而且非常简单t、 最后,在处理完所有酶后,执行一个
remove-erase
步骤来删除空格。这个步骤具有线性复杂性,而且应该很快。@blastfurny是的,这也会起作用。(创建新字符串也是线性的)。剥猫皮的方法不止一种。
found = str.find(str1,found);
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;
}
Success time: 0 memory: 3476 signal:0
  CATGACGATATAAT
/*CATGACGATATAAT*/

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