我遇到与反向翻译有关的问题 问题本身可以表述为:给定20个唯一字母的字符集(对应于20个氨基酸),每个字母表由3个字符组成的代码生成[来自A,T,G,C的任何3个]。产生编码给定氨基酸序列/串的所有可能的核苷酸序列 对于20种氨基酸,存在64种可能的核苷酸[ATGC]组合。 例如:由字母K表示的赖氨酸由两个三联体(=密码子),AAA和GAA编码。
正向翻译很好,因为我可以将三联体映射到氨基酸代码,但问题在于反向翻译,其中三联体的各种组合是可能的,因为大多数氨基酸可以由多个密码子编码。
这是我的计划的基本框架:
//Map all Amino Acids with their corresponding codons.
std::map<std::string, string, std::less<std::string> > somevar;
somevar["K"]="AAA|GAA";......so on.
//Take input in string of Amino Acid single letter codes.
//Split each Amino acid into corresponding codons using stringstream
while(std::getline(ss, token, '|')){}
//Store the values in vector.
第一个问题:由于我不知道输入字符串的大小,我需要动态矢量数组或矢量矢量。 (简单地说,如果发生类似KK的事情,将会有两个数组类型变量存储KK的所有三元组。)是否有某种方法可以消除这种冗余(直接查看某个表)?
//Pass the arrays to a function which will return all possible permutations.
第二个问题:解决第一个问题之后,我想用给定的氨基酸串创建所有可能的核苷酸序列组合。(即,从每个新创建的数组(组)得到的所有可能的组合)。 /> KK将导致:AAAGAA,AAAAAA,GAAAAA,GAAGAA。
唯一的限制是复杂性应该是~O(n ^ 2),我想知道我是否可以递归地执行它,或者是否在c ++中有一些内置的函数/库可以帮助我生成所有给定(可变)数据集的可能排列。
编辑:另一个例子 假如随机字母A有3个密码子,字母Y有5个,那么组合总数将是3 * 5。
如果M = AAT,ATA和N = GTT,AGT,TGT,那么结果将是1)AATGTT,2)ATAGTT,3)AATAGT,4)AATTGT,5)ATAAGT,6)ATATGT
答案 0 :(得分:2)
以下可能会有所帮助:
std::vector<std::string> translate(const std::vector<std::string>& v,
const std::map<std::string, std::vector<std::string>>& mapping)
{
if (v.empty()) {
return {};
}
std::vector<std::string> res = {""};
for (const auto& s : v) {
std::vector<std::string> tmp;
for (const auto& seq : mapping.at(s)) {
for (const auto& old: res) {
tmp.push_back(old + seq);
}
}
res = std::move(tmp);
}
return res;
}
使用:
v
要翻译的序列mapping
"K"
和{"AAA", "GAA"}
答案 1 :(得分:0)
你真的想得到所有排列(所有可能的密码子排序),或者所有可能的字母翻译成密码子(更像是同音异义替换)吗?
如果是后者,对于你的问题2,如果所有字母都有2个可能的密码子(远远超过O(n ^ 2)),则输出字符串的数量将为O(2 ^ n)。
你仍然可以通过递归函数相对简单地使用它(或者不像@Jarod42那样)。
对于你的问题1,我认为你的程序输入实际上是一种存储输出的紧凑方式......
对于一个输入字符串,您的返回类型可以是std::vector<std::string>
,因此您可以为所有输出字符串找到std::vector<std::vector<std::string> >
吗?