文本搜索算法是文本处理和信息检索的基本方法。 该算法允许我们定位和识别较大文本片段中子字符串(或模式)的出现。
怎么运行的
- 从较大的文本(或文档)和要搜索的子字符串开始。
- 按顺序迭代文本的每个字符。
- 将子字符串与与子字符串长度相同的文本部分进行比较。 如果找到匹配,则记录当前位置。
- 移动到下一个位置并继续比较。
例子
考虑以下文本:“让我们在该文本中搜索子字符串,看看算法是如何工作的。”
以及要搜索的子字符串:“substring”
- 从位置 0 开始。
Let'
与“substring”进行比较。 没有匹配。 - 移动到位置 1。
et's
与“substring”进行比较。 没有匹配。 - 移动到位置 2。将
t's
" 与 "substring" 进行比较。没有匹配。 - 移动到位置 3。
's s
与“substring”进行比较。 没有匹配。 - 移动到位置 4。
se
与“substring”进行比较。 没有匹配。 - 移动到位置 5。
sea
与“substring”进行比较。 没有匹配。 - 移动到位置 6。
earc
与“substring”进行比较。 没有匹配。 - 移动到位置 7。
arch
与“substring”进行比较。 没有匹配。 - 移动到位置 8。将
rch
" 与 "substring" 进行比较。没有匹配。 - 移动到位置 9。
ch w
与“substring”进行比较。 没有匹配。 - 移动到位置 10。
h wi
与“substring”进行比较。 没有匹配。 - 移动到位置 11。将 "
wit
与 "substring" 进行比较。没有匹配。 - 移动到位置 12。
with
与“substring”进行比较。 没有匹配。 - 移动到位置 13。
ithi
与“substring”进行比较。 没有匹配。 - 移动到位置 14。
thin
与“substring”进行比较。 没有匹配。 - 移动到位置 15。
hinn
与“substring”进行比较。 没有匹配。 - 移动到位置 16。
in t
与“substring”进行比较。 没有匹配。 - 移动到位置 17。
n th
与“substring”进行比较。 没有匹配。 - 移动到位置 18。将 "
thi
与 "substring" 进行比较。没有匹配。 - 移动到位置 19。
this
与“substring”进行比较。 没有匹配。 - 移动到位置 20。将
his
" 与 "substring" 进行比较。没有匹配。 - 移动到位置 21。
is t
与“substring”进行比较。 没有匹配。 - 移动到位置 22。
s te
与“substring”进行比较。 没有匹配。 - 移动到位置 23。
ubst
与“substring”进行比较。 没有匹配。 - 移动到位置 24。
bstr
与“substring”进行比较。 没有匹配。 - 移动到位置 25。
stre
与“substring”进行比较。 没有匹配。 - 移动到位置 26。
trin
与“substring”进行比较。 没有匹配。 - 移动到位置 27。
ring
与“substring”进行比较。 找到匹配项,记录位置 27。
子字符串“substring”位于文本内的位置 27 处。
C++ 示例代码
#include <iostream>
#include <string>
#include <vector>
std::vector<int> textSearch(const std::string& text, const std::string& query) {
std::vector<int> positions;
for(int i = 0; i <= text.length()- query.length(); ++i) {
int j = 0;
while(j < query.length() && text[i + j] == query[j]) {
++j;
}
if(j == query.length()) {
positions.push_back(i);
}
}
return positions;
}
int main() {
std::string text = "Let's search for a substring within this text to see how the algorithm works.";
std::string query = "substring";
std::vector<int> result = textSearch(text, query);
std::cout << "Substring found at positions: ";
for(int pos: result) {
std::cout << pos << ";
}
std::cout << std::endl;
return 0;
}
在此示例中,该 textSearch
函数用于查找子字符串“substring”在文本中的位置。 结果将是一个包含匹配起始位置的向量。