串的匹配有两种方式,一种是静态方式顺序存储,另外一种是动态方式堆存储。这两种方式都是基于顺序表和链表实现的。串的朴素算法是利用子串的长度来依次匹配子串长度的主串的部分字符,这样就能够每次比较子串长度的字符直到结束。代码以下:ios
#include <iostream> #include <stdio.h> #include <stdlib.h> #define MaxSize 255 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ /** 串的顺序存储和链式存储 因为C语言中有对串直接操做的函数,这只列举一种操做 朴素模式匹配算法 */ //静态定义串的结构体(定长顺序存储) typedef struct{ char ch[MaxSize];//存储字符的数组 int length;//串的实际长度 }SString; //动态方式定义串的结构体(为了不存储密度低的问题,让结点存储多个字符) typedef struct StringNode{ char ch[4];//每一个结点放四个字符 struct StringNode *next;//指针域 }StringNode,*String; //动态定义串的结构体(堆分配存储) typedef struct{ char *ch;//按照串长分配储存区,ch指向串的首地址 int length;//串的实际长度 }HString; //堆分配初始化 void InitHString(HString &S){ S.ch = (char*)malloc(MaxSize*sizeof(char)); S.length = 0; } //求子串 bool SubString(SString &Sub,SString S,int pos,int len){ //子串越界 if(pos+len-1>S.length){ return false; } for(int i=pos;i<pos+len;i++){ Sub.ch[i-pos+1] = S.ch[i]; } Sub.length = len; return true; } //朴素模式匹配算法 int Index(SString S,SString T){ int k=1; int i=k,j=1; while(i<S.length && j<=T.length){ if(S.ch[i]==T.ch[j]){ ++i; ++j;//继续比较后续字符 }else{ k++;//检查下一个子串 i=k; j=1; } } if(j>T.length){ return k; }else{ return 0; } } int main(int argc, char** argv) { HString S; InitHString(S); return 0; }