模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配

假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。P称为模式,T称为目标。如果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功;否则匹配失败。

算法思想

目标串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]不同。

代码

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 != '\0')
    {
        //匹配成功,指针前移
        if (*p == *q)
        {
            p++;
            q++;
        }
        //否则,回溯,通过记录之前的指针位置,重新赋值。
        else
        {
            //s++,p指向回溯的位置.
            s++;
            p = s;
            //q重新指向初始位置
            q =const_cast<char*>(find);
        }
        //执行成功了,返回位置。
        if (*q == '\0')
        {
            return (p - text) - (q - find);
        }
    }
    return -1;
}
暴力算法

相关文章:

  • 2021-09-22
  • 2021-08-13
  • 2021-12-20
  • 2021-12-13
  • 2021-12-17
  • 2022-12-23
  • 2021-04-23
  • 2021-08-05
猜你喜欢
  • 2021-10-07
  • 2021-12-17
  • 2022-01-21
  • 2021-05-22
  • 2021-11-25
  • 2021-09-02
  • 2021-12-09
相关资源
相似解决方案