算法——字符串匹配之朴素算法
来源:互联网 发布:淘宝导航栏半透明代码 编辑:程序博客网 时间:2024/06/05 00:58
前言
本文介绍的是字符串匹配最简单的算法--朴素字符串匹配算法。该算法的原理非常简单,就是通过一个循环找到所有有效偏移,即对检查是否满足条件。算法没有进行预处理,只是对其进行匹配处理,算法过程中是每次移动一位的比较字符,所以时间复杂度是非常大O((n-m+1)m)。
算法实现
根据该算法的描述,这里给出算法导论中的伪代码,并根据伪代码给出具体实现代码,从代码中很清晰地看到该算法的时间复杂度。注:字符下标是从0开始的。
伪代码:
NAIVE_STPRING_MATCHER(T,P)n = T.length;m = P.length;for(s=0;s <= n-m;s++)if P[1..m]==T[s+1..s+m];print "Pattern occurs with shift" s;
C++源码实现:
#include <iostream>#include <string>using namespace std;int NAIVE_STPRING_MATCHER(const string &T,const string &P);int main(){string T = "abcdefghijk";string P = "defg";int s = NAIVE_STPRING_MATCHER(T,P);if(s>=0)cout<<"Pattern occurs with shift:"<<s<<endl;else cout<<"Not macth the P in the T. "<<endl;system("pause");return 0;}int NAIVE_STPRING_MATCHER(const string &T,const string &P){int n = T.length();int m = P.length();if(n < m) return -1;int s_length = n-m;for (int s = 0; s <= s_length; s++){bool flag = false;for(int i = 0;i < m;i++){if(T[s+i]==P[i])flag = true;else {flag = false;break;}}if(flag)return s;}return -1;}
注意:以上的C++源码只可以找出字符串中一次匹配,例如T=abcdefghijkdefg,P=defg,则只能找出第一个有效偏移s=3,第二个有效偏移s=11不能找出。
为了能够找出所有匹配项,我们可以在第一次匹配成功后,继续移动整个模式串,把所有匹配成功的位置找出来。只需要对上面的源码进行修改即可,源码如下:
#include <iostream>#include <string>using namespace std;void NAIVE_STPRING_MATCHER(const string &T,const string &P);int main(){string T = "abcdefghijkdefg";string P = "defg"; NAIVE_STPRING_MATCHER(T,P);system("pause");return 0;}void NAIVE_STPRING_MATCHER(const string &T,const string &P){int n = T.length();int m = P.length();if(n < m) cout<<"the length of P larger than T";int s_length = n-m;for (int s = 0; s <= s_length; s++){bool flag = false;for(int i = 0;i < m;i++){if(T[s+i]==P[i])flag = true;else {flag = false;break;}}if(flag)cout<<"match successed, the s is:"<<s<<endl;}}
或者:
#include <iostream>#include <string>using namespace std;void NAIVE_STPRING_MATCHER(const string &T,const string &P);int main(){string T = "abcdefghijkdefg";string P = "defg";NAIVE_STPRING_MATCHER(T,P);system("pause");return 0;}void NAIVE_STPRING_MATCHER(const string &T,const string &P){ int M = P.length(); int N = T.length(); for (int s = 0; s <= N - M; s++) { int j; for (j = 0; j < M; j++) if (T[s+j] != P[j]) break; if (j == M) cout<<"Pattern found at index:"<<s<<endl; }}
参考资料:
《算法导论》
1 0
- 算法——字符串匹配之朴素匹配算法
- 算法——字符串匹配之朴素算法
- 字符串匹配之朴素算法
- 字符串匹配之朴素字符串匹配算法
- 字符串匹配算法 之 朴素字符串匹配
- 朴素字符串匹配——算法导论
- 字符串匹配——朴素算法
- 字符串匹配 ——朴素算法
- [数据结构]字符串匹配——朴素算法
- 朴素字符串匹配算法
- 字符串朴素匹配算法
- 字符串匹配朴素算法
- 字符串匹配朴素算法
- 字符串匹配——朴素算法、KMP算法
- 朴素的字符串匹配算法
- 字符串匹配 -- 朴素字符串匹配算法
- 字符串匹配算法 朴素算法 Rabin—Karp算法,KMP算法
- 【算法导论】32.1:朴素字符串匹配算法
- hadoop的基本构造
- iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)
- GC启动agent失败
- 生成式学习算法
- windows运行命令
- 算法——字符串匹配之朴素算法
- try-catch-finally
- mybatis resultMap报错
- 冒泡排序算法
- GrideView
- 安卓新手开发学习小技巧
- wordpress变更域名
- Sublime Text 新建文件的模版插件: SublimeTmpl
- Eclipse快捷键