C++朴素字符串匹配算法实现与详解
#include <iostream>
#include <string>
using namespace std;
// 定义朴素字符串匹配函数,接受文本和模式字符串作为输入
int naiveStringMatch(const string& text, const string& pattern) {
int n = text.length(); // 获取文本长度
int m = pattern.length(); // 获取模式长度
// 遍历文本,直到文本中剩余字符数量小于模式长度
for (int i = 0; i <= n - m; i++) {
int j;
// 对于文本中的每个位置,逐个字符比较模式字符串
for (j = 0; j < m; j++) {
if (text[i + j] != pattern[j]) // 如果字符不匹配,则跳出内层循环
break;
}
// 如果所有字符都匹配,则返回模式在文本中的起始索引
if (j == m)
return i;
}
// 如果在文本中找不到模式,则返回-1
return -1;
}
int main() {
string text = 'Hello, world!';
string pattern = 'world';
int result = naiveStringMatch(text, pattern);
if (result != -1)
cout << 'Pattern found at index ' << result << endl;
else
cout << 'Pattern not found' << endl;
return 0;
}
这段代码实现了朴素字符串匹配算法,用于查找字符串中模式的出现。以下是代码的逐行解释:
#include <iostream>和#include <string>: 这些行包含必要的头文件,用于输入/输出操作 (iostream) 和字符串处理 (string)。using namespace std;: 此行引入标准命名空间,避免在代码中重复使用std::。int naiveStringMatch(const string& text, const string& pattern): 这一行定义了一个名为naiveStringMatch的函数,它接受两个参数:要搜索的文本字符串和要查找的模式字符串。该函数返回一个整数,表示模式在文本中第一次出现的索引,如果未找到则返回 -1。int n = text.length();和int m = pattern.length();: 这些行声明整型变量n和m,并分别用文本和模式的长度初始化它们。for (int i = 0; i <= n - m; i++): 此循环遍历文本字符串,直到文本中剩余字符数量小于模式长度。for (j = 0; j < m; j++): 对于文本中的每个位置,此循环遍历整个模式字符串,逐个字符地比较它们。if (text[i + j] != pattern[j]) break;: 如果模式中的任何字符与文本中的相应字符不匹配,则break语句将终止内循环。if (j == m) return i;: 如果内循环成功完成(意味着模式中的所有字符都与文本中的相应字符匹配),则此语句返回模式在文本中出现的起始索引i。return -1;: 如果外循环完成而没有找到匹配项,则此语句返回 -1,表示模式在文本中不存在。
main 函数演示了 naiveStringMatch 函数的用法。它定义了一个示例文本和一个模式,调用该函数查找模式在文本中的位置,并打印结果。
此代码提供了一个关于朴素字符串匹配算法工作原理的清晰简洁的解释。它可以作为学习此算法的良好起点,并可用于开发更高级的字符串匹配算法。
原文地址: https://www.cveoy.top/t/topic/cpbz 著作权归作者所有。请勿转载和采集!