首页 > 其他分享 >串的匹配模式

串的匹配模式

时间:2022-12-12 17:58:23浏览次数:37  
标签:匹配 int 模式 next char slen plen strlen

 

//串的模式匹配
//1.朴素的模式匹配算法
int Index1(char S[], char P[], int pos)
{//查找并返回串P在主串S中从pos位置开始的位置,否则返回-1
    int i, j, slen, plen;
    i = pos; j = 0;
    slen = strlen(S); plen = strlen(P);
    while (i < slen && j < plen)
    {
        if (S[i] == P[j]){
            ++i; ++j;
        }
        else{
            i = i - j + 1;//主串位置回退
            j = 0;
        }
    }
    if (j == plen)
        return i - plen;
    return -1;
}
//2.改进的模式匹配算法(KMP算法)
void GetNext(char p[], int next[])
{
    int i, j, len;
    i = 0; j = -1;
    len = strlen(p);
    next[0] = -1;
    while (i < len)
    {
        if (-1 == j || p[i] == p[j])
        {
            ++i; ++j;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }
}
int Index_KMP(char S[], char P[], int pos, int next[])
{
    int i, j, slen, plen;
    i = pos; j = 0;
    slen = strlen(S); plen = strlen(P);
    while (i < slen && j < plen)
    {
        if (-1 == j || S[i] == P[j])
        {
            ++i; ++j;
        }
        else
        {
            j = next[j];
        }
    }
    if (j == plen)
        return i - plen;
    return -1;
}


void main()
{
    char* s = "ababcdsfds";
    char* p = "abab";
    int d = Index1(s, p, 0);
    const int len = strlen(s);
    int next[5];
    GetNext(p, next);
    int d2 = Index_KMP(s, p, 0, next);
    printf("%d\n%d", d,d2);
    
}

 

**

标签:匹配,int,模式,next,char,slen,plen,strlen
From: https://www.cnblogs.com/htj10/p/16976755.html

相关文章

  • 优维低代码:Theme & Mode 页面主题和模式
    优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维......
  • Java中文件转字符串的一种实现方式 (环绕执行模式&行为参数化&函数式接口|Lambda表达
    文件转字符串方式 --- (环绕执行模式&行为参数化&函数式接口|Lambda表达式)嗯,当然论方便的话,我们直接可以使用,org.apache.commons.io.FileUtils;StringreadFileToStrin......
  • Kubernetes Flannel 高性能网络插件的两种常用工作模式
      Flannel是为Kubernetes设计的一种简单易用的容器网络解决方案,将所有的Pod都组织在同一个子网的虚拟大二层网络中。Flannel支持的后端转发方式有许多种,本文将介绍其......
  • 观察者模式案例
    观察者模式定义:观察者模式定义了一系列对象之间的一对多关系,当一个对象状态改变,其他依赖者都会收到通知。气象站要想多个公告版发送信息,实现每当气象站数据改变时公告板就能......
  • 装饰者模式案例
    在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。拿一个咖啡对象,以摩卡对象来装饰它,以奶泡对象来装......
  • 迭代器模式
    定义迭代器模式迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。实例:三个餐厅要合并,每个餐厅的菜单采用不同和数据结构实现,服务员需要获取......
  • 代理模式
    组成:抽象角色:通过接口或抽象类声明真实角色实现的业务方法。代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加......
  • 观察者模式
    观察者模式的定义定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。推模型目标对象主动向观察者推送目标的详细信息......
  • 模板方法模式
    1.概述定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。2.模式中的角色2.1抽象类(Ab......
  • 适配器模式
    适配器模式定义:适配器模式将一个类的接口,转化成客户期望的另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。适配器分类1组合采用组合方式的适配......