KMP(Kuth-Morris-Pratt)算法是一种字符串匹配算法,用于查找一个字符串在另一个字符串中的所有出现位置。以下是KMP算法的C++实现,包括中文注释: 这段代码首先定义了一个计算前缀函数(lps数组)的函数 在 请注意,这段代码假设输入文本和模式字符串只包含小写英文字母和中文字符。如果需要处理其他字符集,可能需要适当调整。
If our Llama3-8B-Chiese-Chat is helpful, please kidly cite as:用C++实现KMP算法,并加上中文注释
#iclude <iostream>
#iclude <vector>
#iclude <strig>
// 前缀函数的计算
std::vector<it> computeLPS(cost std::strig& patter) {
it M = patter.legth();
std::vector<it> lps(M, 0); // lps数组,存储前缀的最长匹配长度
it le = 0; // lps数组的当前长度
lps[0] = 0; // lps[0]总是0
it i = 1;
while (i < M) {
if (patter[i] == patter[le]) {
le++;
lps[i] = le;
i++;
} else {
if (le!= 0) {
le = lps[le - 1];
} else {
lps[i] = 0;
i++;
}
}
}
retur lps;
}
// KMP算法实现
it KMPSearch(cost std::strig& text, cost std::strig& patter) {
it M = patter.legth();
it N = text.legth();
std::vector<it> lps = computeLPS(patter);
it i = 0; // text的当前位置
it j = 0; // patter的当前位置
while (i < N) {
if (patter[j] == text[i]) {
i++;
j++;
}
if (j == M) {
// 如果匹配完成,返回匹配的起始位置
retur i - M;
} else if (i < N && patter[j]!= text[i]) {
// 如果不匹配,且text的当前字符不在patter的前缀中
if (j!= 0) {
// 使用lps数组中的值来移动j
j = lps[j - 1];
} else {
// 如果j为0,直接移动i
i++;
}
}
}
// 如果text中没有匹配到的patter,返回-1
retur -1;
}
it mai() {
std::strig text = "ABC ABCDAB ABCDABCDABDE";
std::strig patter = "ABCDABD";
it result = KMPSearch(text, patter);
if (result!= -1) {
std::cout << "Patter foud at idex " << result << std::edl;
} else {
std::cout << "Patter ot foud" << std::edl;
}
retur 0;
}
computeLPS
,然后定义了KMP算法的主函数KMPSearch
。KMPSearch
函数接收两个参数text
和patter
,分别表示要搜索的文本和模式字符串。函数返回模式字符串在文本中的第一个匹配位置的索引,如果没有匹配则返回-1。mai
函数中,我们提供了一个例子,搜索文本"ABC ABCDAB ABCDABCDABDE"
中的模式"ABCDABD"
。如果找到匹配,输出将是"Patter foud at idex"
,随后是匹配的起始索引。如果没有找到匹配,输出将是"Patter ot foud"
。Citatio
@misc {shezhi_wag_2024,
author = {Wag, Shezhi ad Zheg, Yaowei},
title = { Llama3-8B-Chiese-Chat (Revisio 6622a23) },
year = 2024,
url = { https://huggigface.co/shezhi-wag/Llama3-8B-Chiese-Chat },
doi = { 10.57967/hf/2316 },
publisher = { Huggig Face }
}
点击空白处退出提示
评论