- 串的结构定义:
- 定长存储表示:
typedef struct { char str[maxSize+1]; int length; }Str;
- 变长存储表示:
typedef struct { char *ch; int length; }Str;
- 定长存储表示:
- 串的基本操作:
- 赋值操作:
int strassign(Str& str, char* ch) { if(str.ch) free(str.ch); //释放原串 int len = 0; char *c = ch; while(*c) { ++len; ++c; } if(len==0) { str.ch = NULL; str.length = 0; return ture; } else { str.ch = (char* )malloc(sizeof(char)*(len+1)); if(str.ch==NULL) return false; else { c=ch; for(int i=0; i<len; ++i,++c) str.ch[i]=*c; str.length = len; return true; } } }
- 取串长度操作:
int strlength(Str str) { return str.length; }
- 串比较操作:
int strcompare(Str s1,Str s2) { for(int i=0;i<s1.length && i<s2.length;++i) if(s1.ch[i]!=s2.ch[i]) return s1.ch[i] - s2.ch[i]; return s1.length -s2.length; }
- 串连接操作:
int concat(Str& str, Str str1, Str str2) { if(str.ch) { free(str.ch); str.ch=NULL; } str.ch=(char*)malloc(sizeof(char)*(str1.length+str2.length+1)); if(str.ch==NULL) return false; int i = 0; while(i<str1.length) { str.ch[i]=str1.ch[i]; ++i; } int j = 0; while(j <=str2.length) { str.ch[i+j] = str2.ch[j]; ++j; } str.length = str1.length +str2.length; return true; }
- 求子串操作:
//求str串从pos 位置开始,长度为len的子串 int substring(Str& substr,Str str, int pos, int len) { if(pos<0||pos>=str.length||len<0||len>=str.lenght-pos) return false; if(substr.ch) { free(substr.ch); substr.ch = NULL; } if(len == 0) { substr.ch = NULL; substr.length = 0; return true; } else { substr.ch = (char*) malloc(sizeof(char)*(len+1)); int i = pos; int j = 0; while(i<pos+len) { substr.ch[j] = str.ch[i]; ++i; ++j; } substr.ch[j] = NULL; substr.length = len; return true; } }
- 串清空操作:
int clearstring(Str& str) { if(str.ch) { free(str.ch); str.ch=NULL; } str.length = 0; return ture; }
- 串的模式匹配算法:
- 简单的模式匹配算法:
//从主串第一个位置和模式串比较 //相等则比较后续字符 //否则从主串的第二个位置进行比较 int index(Str str,Str substr) { int i=0,j=0,k=i; while(i<str.length && j<substr.length) { if(str.ch[i]==substr.ch[i]) { ++i; ++j; } else { j=0; i=++k; } } if(j==substr.length) return k; else return -1; }
- KMP算法:
- http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
- https://subetter.com/articles/2018/04/how-to-understand-kmp.html
-
//求next数组 void getnext(Str substr, int next[]) { int i=0, j=-1; next[0]=-1; while(i<substr.length) { if(j=-1||substr.ch[i]==substr.ch[j]) { ++i; ++j; next[i]=j; } else j=next[j]; } }
-
int KMP(Str str, Str substr, int next[]) { int i=0,j=0; while(i<str.length && j<substr.length) { if(str.ch[i]==substr.ch[j]) { ++i; ++j; } else { j=next[j]; if(j==-1) { j=0; ++i; } } } if(j=substr.length) { return i-substr.length; } else return -1; }
- 简单的模式匹配算法: