美文网首页
6.4 字符串模式匹配

6.4 字符串模式匹配

作者: 个革马 | 来源:发表于2017-04-29 16:07 被阅读23次

1. 朴素模式匹配算法(又叫 简单模式匹配算法)

  • 基本思路:暴力匹配,从第一个字符开始,挨个匹配,如果不符合,则从第二个字符开始,挨个匹配。
int Index(string s, string t)
{
    int i = 0, j = 0;
    while(i <= length(s) && j <=length(t))
    {
        if(s[i] == t[j])
        {
            i++;
            j++;
        }else
        {
            i = i - j + 2; //指向s字符串中下一个字符
            j = 0;
        }
     }

     //如果此时 j 大于length(t),则匹配成功,返回 i  - length(t)即匹配字符串起始位置
     if(j > length(t))  return i - length(t);
     else  return 0;
}

2. 首尾匹配算法

基本思路:从第一个字符开始,首先匹配字符串的首尾是否相符,如果相符再挨个匹配。不然,从下一个字符开始匹配。

while( i <= length(s) && j <= length(t))
{
    if ( s[i] == t[j] && s[i - 1 + length(t)] == t[j - 1 + length(t)] ) //首尾匹配
    {
        i++;
        k = i;
        j++;
        while(s[i] == t[j]) //匹配首尾之间的的字符
        {
            i++;
            j++;
        }

        if (j == length(t))
            return  i - length(t);
                 
    }else{
        i++;
        j = 0;
    }
}
return -1;

3. KMP模式匹配算法

基本思路:通过计算next数组,使得当匹配之时遇到不匹配的字符,不用从头开始匹配,而是从模式字符串中重复且已经匹配过的部分开始。

int KMP(string s, string t, int next[])
{
    int i = 0 , j = 0;

    while(i <= length(s) && j <= length(t))
    {
        if (j == 0 || s[i] == t[j])
        {
            i++;
            j++;
        }else
            j = next[j];  //如果不匹配, j 指向模式串中重复部分的下一个字符
    } 

    if (j > t[0])
        return i - t[0];
    else
        return -1;
}
  • 计算next的方法:
  1. next[1] = 0 , next[2] = 1
  2. 后面解每一位的next[j]值时,令 k = next[j - 1]
  3. 将 s[j - 1]与s[k] 进行比较
    a. 相等,next[j] = k+1;
    b. 不等,令 k = next[k]
    I. k != 0,重复第三步
    II. k == 0, next[j] = 1

相关文章

  • 6.4 字符串模式匹配

    1. 朴素模式匹配算法(又叫 简单模式匹配算法) 基本思路:暴力匹配,从第一个字符开始,挨个匹配,如果不符合,则从...

  • 模式匹配

    模式匹配之字符串 模式匹配之匹配类型 模式匹配之匹配数组、元组、集合 模式匹配之样例类 模式匹配之偏函数

  • Python算法-字符串(String)

    字符串匹配问题字符串匹配(String Matching):又称为模式匹配(Pattern Matching)。可...

  • 一些有关算法的

    字符串模式匹配算法 字符串的KMP算法详解部分匹配表(即)向右移一位就可以得到next数组。字符串模式匹配算法 R...

  • 字符串匹配

    字符串匹配(string matching)也称字符串查找(string searching)或模式匹配(patt...

  • Python 正则表达式

    正则表达式模式 模式描述^匹配字符串的开头$匹配字符串的末尾。.匹配任意字符,除了换行符,当re.DOTALL标记...

  • AC自动机实现屏蔽单词

    多模式自动匹配AC自动机 KMP是多模式匹配算法, 解决的是一个字符串匹配多个模式串的问题, 该字符串往往短于或者...

  • R学习笔记(7):使用stringr处理字符串(2)

    目标:结合正则表达式,实现 确定与某种模式匹配的字符串找出匹配位置提取匹配内容替换匹配内容基于匹配拆分字符串 1....

  • Python的正则表达式

    模式介绍 基本用法 ^: 匹配字符串的开头,如:^很 $: 匹配字符串的末尾,如:蓝$ .: 匹配除了换行符外的任...

  • 四.Shiro - 拦截器配置

    例子 一 . url 匹配模式 支持Ant风格模式 ? : 匹配一个字符 * : 匹配零个或多个字符串 ** : ...

网友评论

      本文标题:6.4 字符串模式匹配

      本文链接:https://www.haomeiwen.com/subject/afuugttx.html