标签:
KMP算法简单粗暴的代码,严密的逻辑,初学的时候,真的很难搞懂,不过曾力胜老师这周出的模式串匹配的变形题目,让我反思了一下KMP算法,昨天晚上写出了链表形式,也算是进步吧。昨天太急,没来得及记录,今天补充起来。
/* Name: KMP之链表写法 Date :2015/3/29 Write by:杨领 */ #include<stdio.h> #include<stdlib.h> typedef struct node { int data;//数据域 struct node *next;//指针域 struct node *search;//对于模式串,记录匹配失败后,移动的位置。相当于KMP的NEXT数组 }Lnode,*P_node;//链表结点 P_node CreactNode(int x)//创建并初始化每一个结点 { P_node q=(P_node)malloc(sizeof(Lnode)); q->next=NULL; q->search=NULL; q->data=x; return q; } P_node LinkNode(int x)//创建长度为x的链表(含有头结点),并返回头指针的值 { P_node root=CreactNode(x); P_node p=root; int i,temp; for(i=1;i<=x;i++) { scanf("%d",&temp); p->next=CreactNode(temp); p=p->next; } return root; } void GetSearch(P_node root)//对头指针root引出的模式串处理,相当于KMP算法中对NEXT数组的处理 { P_node p,q,head; head=p=root; q=p->next; q->search=head; while(q){ if(p==head||p->data==q->data||q->next==NULL) { p=p->next; q=q->next; if(q) q->search=p; } else p=p->search; } } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF){//目标链表节点数n,模式链表节点数m P_node p,q,root1,root2;//root1是目标链表,root2是模式链表 root1=LinkNode(n); root2=LinkNode(m); q=root2; p=root1->next; GetSearch(root2); while(p&&q){ if(p->data==q->data||q==root2){ p=p->next; q=q->next; } else q=q->search; } printf(!q?"Yes\n":"No\n"); } }
测试数据:
标签:
原文地址:http://www.cnblogs.com/yanglingwell/p/4379437.html