❤️求子串❤️
#include <stdio.h> #include <cstdlib> #define MAXSIZE 255//预定义串的最大长度为255 typedef struct { char ch[MAXSIZE];//静态数组的方式存储 int length; }SString; //求子串 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 main(){ return 0; }
❤️子串的比较操作❤️
//比较操作 int StrCompare(SString S,SString T){ for(int i=1;i<=S.length&&i<=T.length;i++){ if(S.ch[i]!=T.ch[i]) return S.ch[i]-T.ch[i]; } //扫描过的所有字符都相同,则长度长的串更大 return S.length-T.length; }
❤️子串的定位操作❤️
int Index(SString S,SString T){ int i=1,n=StrLength(S),m=StrLength(T); SString sub;//用于暂存子串 while (i<=n-m+1){ SubString(sub,S,i,m); if (StrCompare(sub,T)!=0) ++i; else return i;//用于返回子串在主串中的位置 } return 0; }
❤️朴素模式匹配算法❤️
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; }
❤️KMP算法❤️
int Inde_KMP(SString S,SString T,int next[]){ int i=1,j=1; while(i<S.length&&j<=T.length){ if (j==0||S.ch[i]==T.ch[j]){ ++i; ++j;//继续比较后续字符 } else j=next[j];//模式串向右移动 } if(j>T.length) return i-T.length;//匹配成功 else return 0; }