zoukankan      html  css  js  c++  java
  • 字符串匹配的三种算法

    下面将介绍三种有关字符串匹配的算法,一种是朴素的匹配算法,时间复杂度为O(mn),也就是暴力求解。这种方法比较简单,容易实现。一种是KMP算法,时间复杂度为O(m+n),该算法的主要任务是求模式串的next数组。另外还有一种对KMP算法的改进,主要是求nextval数组。

    第一种朴素的匹配算法:

    int index(char str[], char subStr[])
    {
        int i = 0, j = 0,index = 0;
        while (str[i] != '' && subStr[j] != '')
        {
            //当前字符匹配,执行下一个字符
            if (str[i] == subStr[j])
            {
                i++; j++;
            }
            else
            {
                i = ++index;
                j = 0;
            }
        }
            //匹配成功
        if (j == strlen(subStr))
            return index;
        else
            return -1;
    }

    第二种算法KMP算法,求next数组,next[j]表示,当模式串j位置与主串i位置处发生不匹配时,i指针不回溯,j指针回溯到next[j]的位置。

    对于求next[j]有三种情况:

    1、j = 0时,next[j] = -1;//即模式串的第一个字符与主串i位置发生不匹配,应将i跳过当前位置,从下一个位置和模式串的第一个字符继续比较。

    2、假设已知next[j] = k,即subStr[0,...,k-1] = subStr[j-k,j-1]。当subStr[k] = subStr[j]时,也就是说模式串满足subStr[0,...,k] = subStr[j-k,j],可以得知next[j+1] = k + 1 = next[j] + 1;

    3、当subStr[k] != subStr[j]时,就需要从k位置之前去查找与subStr[j]匹配的位置,假设为j'。这样问题又可以转化为第二种情况,即next[j+1] = next[j'] + 1 = k' + 1。

     具体求解方法,请阅读http://www.cnblogs.com/tgycoder/p/4997067.html,文中给出了三种求解next数组的方法。

    第三种算法是对KMP算法的一种优化,主要是求nextval数组。

  • 相关阅读:
    docker stats
    Appium 环境搭建
    docker 进入容器
    Mac下Mysql启动异常["ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"]
    python 虚拟环境--virtualenv
    visjs 绘图 图标 动态添加数据
    js 滑块登录验证
    js iframe 最顶层显示
    转化为数组
    videojs双击全屏幕观看,videojs动态加载视频
  • 原文地址:https://www.cnblogs.com/tgycoder/p/4996059.html
Copyright © 2011-2022 走看看