目录
串的存储结构
串的顺序存储
定长式:
#include<bits/stdc++.h> using namespace std; #define MAXSIZE 225 //顺序栈存储空间的初始分配量 #define OK 1 //成功标识 #define ERROR 0 //失败标识 typedef int Status; //Status是函数的类型,其值是函数结果状态代码,如OK等 typedef struct { char ch[MAXSIZE]; int len;//当前长度 }sstring;
堆式:
#include<bits/stdc++.h> using namespace std; #define MAXSIZE 225 //顺序栈存储空间的初始分配量 #define OK 1 //成功标识 #define ERROR 0 //失败标识 typedef int Status; //Status是函数的类型,其值是函数结果状态代码,如OK等 typedef struct { char *ch; int len;//当前长度 }hsstring;
串的链式存储
1、链表存储串值时,存在节点大小问题,即每个节点可存放一个字符也可存放多个字符,
2、但串长不一定是节点大小的整数倍,则链表中的最后一个节点不一定全被串值占满,此时通常用“#”补上
#include<bits/stdc++.h> using namespace std; #define MAXSIZE 225 //顺序栈存储空间的初始分配量 #define OK 1 //成功标识 #define ERROR 0 //失败标识 typedef int Status; //Status是函数的类型,其值是函数结果状态代码,如OK等 typedef struct chunk{//chunk-块 char ch; struct chunk *next; }chunk; typedef struct { chunk *head; chunk *tail; int length; }lstring;
串的模式匹配算法
BF算法
int BF(sstring s,sstring t ,int pos) { int i=pos,j=1;//初始化 while(i<=s.len &&j<=t.len ) //未比较到串尾 { if(s.ch[i]==t.ch[j]) { i++;j++;//继续比较后序字符 } else { i=i-j+2;//主串回溯;i-j+1回到初始位置,再加1,开始匹配 j=1;//子串回溯 } } if(j>t.len ) return i-t.len ;//匹配成功 else return 0; }
KMP算法
前期了解:
KMP 算法主要是通过消除主串指针的回溯,以及改变字串回溯的位置来提高匹配的效率的
具体实现就是通过一个next()函数(即构造的前缀表)实现,每一个字符前的字符串的最长相等前后缀即该字符的前缀值
(7条消息) kmp算法简单讲解_turbo夏日漱石的博客-CSDN博客
next前缀值不仅仅代表着对应位置字符串前后缀相同元素长度的最大值
因为是前后缀的公共元素,它还可以表示该位置与从字符串首位起固定位置的字符相同,即指向自身与其相同的元素的位置。
next数组获取:
void getnext(sstring t,int next[]) { int i=1,j=0,next[1]=0;//初始化 while(i<t.len )//未比较到串尾 { if(j==0||t.ch[i]==t.ch[j]) { i++;j++;//比较后继字符 next[i]=j; } } }
kmp:
int KMP(sstring s,sstring t ,int pos) { int i=pos,j=1;//初始化 while(i<=s.len&&j<=t.len ) //未比较到串尾 { if(j==0||s.ch[i]==t.ch[j]) { i++;j++;//比较后继字符 } else j=next[j];//模式串向右回溯 } if(j>t.len ) return i-t.len ; else return 0; }