串的匹配有兩種方式,一種是靜態方式順序存儲,另外一種是動態方式堆存儲。這兩種方式都是基於順序表和鏈表實現的。串的樸素算法是利用子串的長度來依次匹配子串長度的主串的部分字符,這樣就能夠每次比較子串長度的字符直到結束。代碼以下: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; }