模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。
假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。P称为模式,T称为目标。如果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功;否则匹配失败。
蛮力算法(BF算法)
算法思想
从目标串T的的第一个字符起与模式串P的第一个字符比较。
若相等,则继续对字符进行后续的比较;否则目标串从第二个字符起与模式串的第一个字符重新比较。
直至模式串中的每个字符依次和目标串中的一个连续的字符序列相等为止,此时称为匹配成功,否则匹配失败。
算法性能
假设模式串的长度为m,目标串的长度为n:N为外循环,M为内循环。
BF算法存在回溯,严重影响到效率,最坏的情况的是N*M,所以算法的复杂度为O(mn).暴力算法中无法利用已知的信息,也就是模式串的信息,减少匹配。比如在第四步中,t[5]和p[4]不匹配,然后又回溯(图有点问题),t[3]和P[0]肯定不同,因为之前匹配过了,我们得知t[3]=p[1],而p[0]和p[1]不同。
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int bf(const char *text, const char *find) { //异常判断 if (*text == '/0' || *find == '/0') { return -1; } int find_len = strlen(find); int text_len = strlen(text); if (text_len < find_len) { return -1; } //去除const属性 char *s =const_cast<char*>(text); char *p = s; char *q = const_cast<char*>(find); //执行BF算法 while (*p != '