修正KMP算法 顺序串操作
来源:互联网 发布:淘宝卖家管控记录 编辑:程序博客网 时间:2024/06/05 17:46
课下练习
/*整型数据最好不要用 引用传参*/#include<stdio.h>#include<stdlib.h>#define MaxSize 100typedef struct{ char data[MaxSize]; int length;} SqString;//初始化串void InitString(SqString* &s){ s=(SqString*)malloc(sizeof(SqString)); s->length=0;}//生成一个与str串相等的s串void StrAssign(SqString* &s,char str[]){ int i; for(i=0; str[i]!='\0'; i++) { s->data[i]=str[i]; } s->data[i]='\0'; s->length=i;//不包括字符串最后一个空字符}//将串t复制给串svoid StrCopy(SqString* &s,SqString* &t){ int i; for(i=0; i<t->length; i++) { s->data[i]=t->data[i]; } s->data[i]='\0'; s->length=t->length;}//判断两个串是否相等bool StrEqual(SqString* &s,SqString* &t){ int i=0; if(s->length!=t->length) return false; else { for(i=0; i<s->length; i++) { if(s->data[i]!=t->data[i]) { return false; break; } } return true; }}//返回串中的字符数int StrLength(SqString* &s){ return s->length;}//将串s和串t连接在一起SqString* Concat(SqString* &s,SqString* &t){ int i,j=0; SqString *p; InitString(p); for(i=0; i<s->length; i++) { p->data[i]=s->data[i]; } for(i=s->length; i<s->length+t->length; i++,j++) { p->data[i]=t->data[j]; } p->data[s->length+t->length]='\0'; p->length=s->length+t->length; return p;}//求子串:返回串s中从第i个字符开始的,由连续j个字符组成的子串SqString* SubStr(SqString* &s,int i,int j){ int k=0; SqString *q; InitString(q); if(i<=0||i>s->length||j<0||i+j-1>s->length) return q; for(k=i-1; k<i+j-1; k++) { q->data[k-i+1]=s->data[k]; } q->length=j; q->data[j]='\0'; return q;}//将串t插入到串s中第i个位置,并返回新的串SqString* InsStr(SqString* &s,int i,SqString* &t){ int j=0; SqString *q; InitString(q); if(i<=0||i>s->length+1) return q; for(j=0; j<i-1; j++) { q->data[j]=s->data[j]; } for(j=0; j<t->length; j++) { q->data[i+j-1]=t->data[j]; } for(j=i-1; j<s->length; j++) { q->data[t->length+j]=s->data[j]; } q->length=s->length+t->length; q->data[q->length]='\0'; return q;}//从串s中删去第i个字符开始的长度为j的子串,并返回产生的新串SqString* DelStr(SqString* &s,int i,int j){ int k; SqString *q; InitString(q); if(i<=0||i>s->length||i+j>s->length+1) return q; for(k=0; k<i-1; k++) { q->data[k]=s->data[k]; } for(k=i+j-1; k<s->length; k++) { q->data[k-j]=s->data[k]; } q->length=s->length-j; q->data[q->length]='\0'; return q;}//在串s中,将第i个字符开始的j个字符构成的子串用串t替换,并返回产生的新串SqString* RepStr(SqString* &s,int i,int j,SqString* &t){ int k; SqString *q; InitString(q); if(i<=0||i>s->length||i+j-1>s->length) return q; for(k=0; k<i-1; k++) { q->data[k]=s->data[k]; } for(k=0; k<t->length; k++) { q->data[i+k-1]=t->data[k]; } for(k=i+j-1; k<s->length; k++) { q->data[t->length+k-j]=s->data[k]; } q->length=s->length-j+t->length; q->data[q->length]='\0'; return q;}//输出串void PrintStr(SqString* &s){ int i=0; while(s->data[i]!='\0') { printf("%c",s->data[i]); i++; } printf("\n"); printf("%d\n",s->length);}void GetNextval(SqString* &s,int nextval[]){ int j=0,k=-1; nextval[0]=-1; while(j<s->length) { if(k==-1||s->data[j]==s->data[k]) { j++; k++; if(s->data[j]!=s->data[k]) nextval[j]=k; else nextval[j]=nextval[k]; } else k=nextval[k]; }}int KMPIndex(SqString* &s,SqString* &t){ int i=0,j=0; int nextval[MaxSize]; GetNextval(t,nextval); while(i<s->length&&j<t->length) { if(j==-1||s->data[i]==t->data[j]) { i++; j++; } else { j=nextval[j]; } } if(j>=t->length) return (i-t->length); else return -1;}int main(){ int v; char a[20]= {"I Love China"}; char b[20]= {"China"}; SqString *p; SqString *q; // SqString *m,*n; InitString(p); InitString(q); StrAssign(p,a); StrAssign(q,b); //m=InsStr(p,5,q); //n=DelStr(m,5,4); //PrintStr(n); v=KMPIndex(p,q); printf("%d\n",v); return 0;}
0 0
- 修正KMP算法 顺序串操作
- 修正的KMP算法
- KMP 顺序串操作练习
- KMP算法 next nextal修正
- 定长顺序串的kmp算法
- 串的模式匹配(基于修正的KMP的匹配算法)
- 串的操作(KMP算法实现)
- 字符匹配 真正理解KMP算法的力量 ( 修正)
- C++实现KMP算法(修正版,C++风格)
- 串算法 - KMP算法
- 数据结构串的基本操作及KMP算法
- 串操作——定长顺序存储,堆分配存储,模式匹配(KMP)
- 利用KMP算法,求顺序表存储的两个字符串的最长公共子串
- 串和KMP算法
- KMP串匹配算法
- KMP串匹配算法
- KMP串匹配算法
- 串-KMP算法
- Hibernate主键自动生成的几种常用类型
- Crontab脚本无法正常执行问题
- 【Android Studio】AS 使用记录01(导入GitHub项目)
- Android Butterknife 使用
- 在Quake4中创建模型
- 修正KMP算法 顺序串操作
- Linux下如何完整的构建cmake项目
- Linux 对拍脚本
- Map集合 把map集合转成set的方法
- [Web]万网虚拟机(阿里的)怎么实现apk、ipa文件下载?
- 自适应模糊神经网络的设计
- C面试常考知识点详解
- 队列实现迷宫问题
- POJ NOI0105-43 质因数分解