C++编写程序利用KMP算法实现病毒感染检测。程序输入为病人的DNA数据和病毒的DNA数据,如果病人感染病毒则输出YES,否则输出NO。
时间: 2024-11-11 09:39:38 浏览: 37
在C++中,我们可以使用Knuth-Morris-Pratt (KMP) 算法来实现病毒感染检测。这个算法用于字符串匹配,适合处理查找模式串是否在主串中出现的问题。以下是简化的步骤:
1. **预处理模式串**:
首先,对于病毒的DNA数据(模式串),我们需要创建一个部分匹配表(也称为失配指针数组)。该表记录了在前缀部分与当前字符不匹配时,我们能向前移动到多少位置,仍然有可能找到完整的匹配。
2. **KMP算法核心**:
- 定义两个指针,`i`(遍历主串即病人DNA的数据)和`j`(遍历模式串即病毒DNA的数据)。
- 如果`i`和`j`都有效(`i < 主串长度` 和 `j < 模式串长度`),比较`主串[i]`和`模式串[j]`:
- 如果相等,将`i`和`j`都加一;
- 否则,如果`j`有对应的失配指针(`table[j]`),说明之前已经遇到过相同的不匹配情况,更新`j = table[j]`;
- 如果`j`没有失配指针,那么尝试把`i`向右移动一位,因为找不到匹配,继续检查下一个字符。
3. **匹配判断**:
当`i == 主串长度`时,意味着找到了完整匹配,表示病人可能感染病毒,输出"YES";若遍历完主串都没有找到匹配,就输出"NO"。
以下是一个简单的C++代码示例:
```cpp
#include <iostream>
#include <vector>
// KMP构建失配指针表
std::vector<int> build_table(const std::string& pattern) {
int n = pattern.size();
std::vector<int> table(n);
for (int i = 1; i < n; ++i) {
table[i] = (pattern[i] == pattern[i - 1]) ? table[i - 1] : 0;
while (table[i] != 0 && pattern[i] != pattern[table[i]])
table[i] = table[table[i] - 1];
if (pattern[i] == pattern[table[i]])
table[i]++;
}
return table;
}
bool virus_detection(const std::string& dna, const std::string& virus_pattern) {
auto table = build_table(virus_pattern);
int i = 0, j = 0;
for (; i < dna.length(); ++i) {
if (j == virus_pattern.length()) {
std::cout << "YES" << std::endl;
return true;
}
if (dna[i] == virus_pattern[j])
j++;
else if (j > 0)
j = table[j - 1];
else
i++, j = 0;
}
std::cout << "NO" << std::endl;
return false;
}
int main() {
std::string dna, virus;
std::cin >> dna >> virus;
virus_detection(dna, virus);
return 0;
}
```
阅读全文