Horspool 字符串匹配算法

简介: Horspool 字符串匹配算法对Boyer-Moore算法的简化算法。 Horspool 算法是一种基于后缀匹配的方法,是一种“跳跃式”匹配算法,具有sub-linear亚线性时间复杂度。 Horspool 算法:   对于每个搜索窗口,该算法将窗口内的最后一个字符和模式串中的最后一个字符进行比较。

Horspool 字符串匹配算法对Boyer-Moore算法的简化算法。

Horspool 算法是一种基于后缀匹配的方法,是一种“跳跃式”匹配算法,具有sub-linear亚线性时间复杂度

Horspool 算法:

  对于每个搜索窗口,该算法将窗口内的最后一个字符模式串中的最后一个字符进行比较。如果相等,则需要进行一个校验过程。该校验过程在搜索窗口中从后向前对文本和模式串进行比较,直到完全相等或者在某个字符处不匹配。无论匹配与否,都将根据字符d在模式串中的下一个出现位置将窗口向右移动

   可以使用下图进行理解:

  (1)窗口大小与模式串大小相同,窗口内容为文本内容的一部分。

  (2)对于窗口而言,每次从后向前匹配,直到全部相等(匹配),或者遇到不相等。

  (3)遇到不相等时,根据窗口中最后一个字符在模式串中的位置,窗口进行移动。如果模式串中有多个相同的字符,选择最后一个字符为准,以避免漏解。

  

代码(C++):

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 /**
 5 计算可跳转字符个数数组
 6 */
 7 int getDis(string &str,int *dis)
 8 {
 9     int len=str.length();
10     for (int i = 0; i < 256; i++)
11         dis[i]=len;    //最大跳跃字符数
12 
13     for (int i = 0; i < len-1; i++)    //注意这里不包括最后一个
14         dis[str[i]]=len-1-i;
15     return 0;
16 }
17 
18 /**
19 查找
20 */
21 int search(string &text,string &pattern,int *dis)
22 {
23     int j,pos;
24     bool tag=false;
25     int lenPattern=pattern.length();
26     int lenTrext=text.length();
27 
28     j=0;
29     pos=0;
30     while(pos<=lenTrext-lenPattern)
31     {
32         j=lenPattern-1;
33         while(j>=0 && pattern[j]==text[pos+j])  //向前搜索
34             j--;
35         if(j==-1)
36         {
37             tag=true;
38             cout<<"The result is :"<<pos<<endl<<endl;
39             pos=pos+lenPattern;
40             continue;
41         }
42         else
43             pos=pos+dis[text[pos+lenPattern-1]];    //使用最后一个字符对齐的方法,进行“跳跃”移动
44     }
45     if(tag == false)    //不存在匹配
46         cout<<"-1"<<endl<<endl;
47     return 0;
48 }
49 
50 int main()
51 {
52     int dis[256];
53     string text;
54     string pattern;
55     while(true)
56     {
57         cout<<"文本:";
58         cin>>text;
59         cout<<"模式:";
60         cin>>pattern;
61         getDis(pattern,dis);
62         search(text,pattern,dis);
63     }
64     return 0;
65 }
View Code

 程序运行:

相关文章
|
3月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
1月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
74 1
两个字符串匹配出最长公共子序列算法
|
3月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
4月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
273 1
|
4月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
118 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
3月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
81 0
|
5月前
|
存储 算法 Cloud Native
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
|
5月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
4月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
5月前
|
存储 算法 Java
Java数据结构与算法:用于高效地存储和检索字符串数据集
Java数据结构与算法:用于高效地存储和检索字符串数据集