给你一个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;
}
答案 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*/