乌龟得到了他的基因组,一个只包含“ATCG"四种字母的字符串。乌龟想起科学家说,基因组中很多片段都多次重复出现,而且这种重复是很有意义的,于是他想计算一下自己基因组里片段的重复情况。 给定一个基因组,其中一个长度为的子串称为一个“k-片段”。乌龟希望你计算出基因组中不同的片段数量。例如,基因组“TACAC”的片段有“TA”,“AC”,“CA”,“AC”,其中不同的片段数量有个。(c++)
时间: 2023-12-26 18:06:23 浏览: 119
好的,以下是使用哈希表实现的C++代码:
```cpp
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int countKmers(string genome, int k) {
unordered_map<string, int> freqMap;
int count = 0;
for (int i = 0; i <= genome.length() - k; i++) {
string kmer = genome.substr(i, k);
if (freqMap.find(kmer) == freqMap.end()) { // 如果哈希表中没有当前k-mer
freqMap[kmer] = 1; // 将其插入哈希表
count++; // 并将计数器加1
} else {
freqMap[kmer]++; // 如果哈希表中已经有当前k-mer,将其计数加1
}
}
return count;
}
int main() {
string genome = "TACAC";
int k = 2;
int numKmers = countKmers(genome, k);
cout << "The number of distinct " << k << "-mers in the genome is: " << numKmers << endl;
return 0;
}
```
在上面的代码中,我们首先声明了一个`unordered_map<string, int>`类型的哈希表`freqMap`,用来记录每个k-mer出现的次数。然后我们对基因组`genome`中的每个长度为k的子串进行遍历,在每次遍历时,我们首先使用`substr`函数提取出当前的k-mer,然后在哈希表中查找是否已经存在该k-mer。如果哈希表中没有当前k-mer,则将其插入哈希表,并将计数器`count`加1;否则,将其计数加1即可。最后,我们返回计数器`count`,即为基因组中不同的k-mer数量。
上述代码的输出结果为:
```
The number of distinct 2-mers in the genome is: 3
```
即基因组“TACAC”中不同的2-mer数量为3。
阅读全文