串的模式匹配相关问题(BF算法、KMP算法)

简介: 串的模式匹配相关问题(BF算法、KMP算法)

一、字符串中删除子串

【问题描述】编写一个程序,当在一个字符串中出现子串时就删除它(字符串的字符个数不超过1000)。

【输入形式】第一行输入一个字符串,第二行输入一个子串。

【输出形式】程序在下一行输出删除其中所有子串后的字符串。如果字符串不包含子串则输出原字符串本身。

【样例输入1】

I am a boy!

a            

【样例输出1】

I m  boy!      

【样例输入2】    

Ah Love!could you and I with Fate conspire

ould

【样例输出2】

Ah Love!c you and I with Fate conspire

【样例说明】

删除第一个字符串中所有的子串,包括连续出现的子串。

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define SIZE 128
#define INCREAM 10
typedef struct String{
  char *data;
  int len;
  int size;
}String,*PString;
int Init_String(PString S){              //初始化
  S->data=(char *)malloc(sizeof(char)*SIZE);
  S->len=0;
  S->size=SIZE;
  return 1;
}
int Creat_String(PString S,char *s){    //串的赋值
  int i=0;
  int n=strlen(s);
  while(*s!='\0'){
    if(S->size<n){
      S->data=(char*)realloc(S->data,(S->size+INCREAM)*sizeof(char));
      S->size+=INCREAM;
    }
    S->data[i++]=*s++;
    S->len++;
  }
  return 1;
}
int Index_BF(PString S1,PString S2,int start){    //BF算法
  int i=start-1,j=0;
  while(i<S1->len&&j<S2->len){
    if(S1->data[i]==S2->data[j]){
      i++;
      j++;
    }else{
      i=i-j+1;
      j=0;
    }
  }
  if(j>=S2->len){
    return i-S2->len+1;
  }else{
    return 0;
  }
}
int Print_String(PString S){   
  int i;
  for(i=0;i<S->len;i++){
    printf("%c",S->data[i]);
  }
  printf("\n");
  return 1;
}
int Delete_String(PString S,PString T){      //删除操作
  int i,j,k,t;
  for(i=0;i<S->len;i++){      
    if(Index_BF(S,T,1))       //找到要删除子串在主串的位置
    {
        t=Index_BF(S,T,1);         
        for(j=0;j<T->len;j++){        //删除次数为子串的长度
          for(k=t-1;k<S->len-1;k++){   
            S->data[k]=S->data[k+1];
        }
        S->len--;     //每次删除一个字符后,串的长度减 1
      } 
    }
  }
    return 1;
}
int main(){
  char s1[100],s2[100];
  int next[100];
  String S1,S2;
  Init_String(&S1);
  Init_String(&S2);
  gets(s1);
  gets(s2);
  Creat_String(&S1,s1);
  Creat_String(&S2,s2);
  Delete_String(&S1,&S2);
    Print_String(&S1);
    return 0;
}

二、BF 算法

【问题描述】

串的模式匹配算法BF的应用。

【输入形式】

第一行输入主串s;

第二行输入模式串t;

输入串中均不包含空格字符。

【输出形式】

模式串在主串s中的出现的每一个位置序号。若一次都未匹配到,则输出0。

【样例输入1】

ababcabcacbab

ab

【样例输出1】

1 3 6 12

【样例输入2】

111113455113232342432432

11

【样例输出2】

1 2 3 4 10

【样例输入3】

fasdfdsfsadfdsdsagetgrdgfdgdf

2312

【样例输出3】

0

【评分标准】

采用BF算法。

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define SIZE 128
#define INCREAM 10
typedef struct String{
  char *data;
  int len;
  int size;
}String,*PString;
int Init_String(PString S){
  S->data=(char *)malloc(sizeof(char)*SIZE);
  S->len=0;
  S->size=SIZE;
  return 1;
}
int Creat_String(PString S,char *s){
  int i=0;
  int n=strlen(s);
  while(*s!='\0'){
    if(S->size<n){
      S->data=(char*)realloc(S->data,(S->size+INCREAM)*sizeof(char));
      S->size+=INCREAM;
    }
    S->data[i++]=*s++;
    S->len++;
  }
  return 1;
}
int Index_BF(PString S1,PString S2,int start){   //BF算法
  int i=start-1,j=0;
  while(i<S1->len&&j<S2->len){
    if(S1->data[i]==S2->data[j]){
      i++;
      j++;
    }else{
      i=i-j+1;
      j=0;
    }
  }
  if(j>=S2->len){
    return i-S2->len+1;
  }else{
    return 0;
  }
}
int Prints_String(PString S,PString T){
  int x;
  x=Index_BF(S,T,1);
  if(x==0) printf("0\n");   
  while(x!=0){
    printf("%d ",x);
    x=Index_BF(S,T,x+1);   //下一次遍历从当前字符后面一个字符开始
  }
  return 1;
}
int main(){
  char s1[100],s2[100];
  int next[100];
  String S1,S2;
  Init_String(&S1);
  Init_String(&S2);
  gets(s1);
  gets(s2);
  Creat_String(&S1,s1);
  Creat_String(&S2,s2);
    Prints_String(&S1,&S2);
    return 0;
}

三、KMP 算法

【问题描述】

串的模式匹配算法实现(KMP算法)

【输入形式】

第一行输入主串s;

第二行输入模式串t;

第三行输入起始位置pos;

【输出形式】

输出模式串t的next值(以空格分隔)

输出模式匹配结果

【样例输入1】

ababcabcacbab

abcac

1

【样例输出1】

-1 0 0 0 1

6

【评分标准】

采用kmp算法。(next值从-1开始)  

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define SIZE 128
#define INCREAM 10
typedef struct String{
  char *data;
  int len;
  int size;
}String,*PString;
int Init_String(PString S){
  S->data=(char *)malloc(sizeof(char)*SIZE);
  S->len=0;
  S->size=SIZE;
  return 1;
}
int Creat_String(PString S,char *s){
  int i=0;
  int n=strlen(s);
  while(*s!='\0'){
    if(S->size<n){
      S->data=(char*)realloc(S->data,(S->size+INCREAM)*sizeof(char));
      S->size+=INCREAM;
    }
    S->data[i++]=*s++;
    S->len++;
  }
  return 1;
}
int Next_String(PString S,int next[]){   //Next数组
  int i=0,j=-1;
  next[0]=-1;
  while(i<S->len){
    if((j==-1)||(S->data[i]==S->data[j])){
      i++;
      j++;
      next[i]=j;
    }else{
      j=next[j];
    }
  }
  for(i=0;i<S->len;i++){
    printf("%d ",next[i]);
  }
  printf("\n");
  return 1;
}
int Index_KMP(PString S,PString T,int start,int next[]){   //KMP算法
  int i=start-1,j=0;
  while(i<S->len&&j<T->len){
    if(j==-1||S->data[i]==T->data[j]){
      i++;
      j++;
    }else{
      j=next[j];    //next数组
    }
  }
  if(j>=T->len){
    printf("%d\n",i-T->len+1);
  }else{
    printf("0\n");
  }
}
int main(){
  char s1[100],s2[100];
  int next[100];
  String S1,S2;
  Init_String(&S1);
  Init_String(&S2);
  gets(s1);
  gets(s2);
  Creat_String(&S1,s1);
  Creat_String(&S2,s2);
    Next_String(&S2,next);
    Index_KMP(&S1,&S2,1,next);
    return 0;
}

四、带通配符“?”的模式匹配

【问题描述】

编写一个具有通配符?的模式匹配算法。?可以与任意一个字符匹配。

【输入形式】

输入主串s;

输入子串t;

输入起始位置pos。

【输出形式】

输出匹配结果:子串第一次出现的位置,若未找到,输出0。

【样例输入1】

there are many cats.

?re

1

【样例输出1】

3

【样例输入2】

thsdfiewnjf fsdfdsjewd

f??f

3

【样例输出2】

13

【样例说明】

?为英文状态符号。由于输入串中可能含有空格,请使用gets读入字符串。

【评分标准】

采用kmp或者bf算法均可。

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define SIZE 128
#define INCREAM 10
typedef struct String{
  char *data;
  int len;
  int size;
}String,*PString;
int Init_String(PString S){
  S->data=(char *)malloc(sizeof(char)*SIZE);
  S->len=0;
  S->size=SIZE;
  return 1;
}
int Creat_String(PString S,char *s){
  int i=0;
  int n=strlen(s);
  while(*s!='\0'){
    if(S->size<n){
      S->data=(char*)realloc(S->data,(S->size+INCREAM)*sizeof(char));
      S->size+=INCREAM;
    }
    S->data[i++]=*s++;
    S->len++;
  }
  return 1;
}
int Index2_BF(PString S1,PString S2,int start){   //BF算法
  int i=start-1,j=0;
  while(i<S1->len&&j<S2->len){
    if((S1->data[i]==S2->data[j])||S2->data[j]=='?'){   //在BF算法中加一个条件即可
      i++;
      j++;
    }else{
      i=i-j+1;
      j=0;
    }
  }
  if(j>=S2->len){
    printf("%d ",i-S2->len+1);
  }else{
    printf("0\n");
  }
}
int main(){
  char s1[100],s2[100];
  int next[100];
  String S1,S2;
  Init_String(&S1);
  Init_String(&S2);
  gets(s1);
  gets(s2);
  Creat_String(&S1,s1);
  Creat_String(&S2,s2);
    int n;
    scanf("%d",&n);
    Index2_BF(&S1,&S2,n);
    return 0;
}

a3f46dd0ffac49a785ab6381a75d637c.png


07ee2900ef084a748d2a2b7ed635ccca.png

目录
相关文章
|
12天前
|
前端开发 算法 JavaScript
无界SaaS模式深度解析:算力算法、链接力、数据确权制度
私域电商的无界SaaS模式涉及后端开发、前端开发、数据库设计、API接口、区块链技术、支付和身份验证系统等多个技术领域。本文通过简化框架和示例代码,指导如何将核心功能转化为技术实现,涵盖用户管理、企业店铺管理、数据流量管理等关键环节。
|
20天前
|
算法
第四章 KMP算法理论基础
第四章 KMP算法理论基础
14 0
|
23天前
|
算法
KMP算法
KMP算法
22 0
|
3月前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
3月前
|
算法
KMP算法
KMP算法
25 0
|
4月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
6天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
24天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
3天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
4天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。