这是我原来51cto上博客移植过来的。凑合看吧。不过真的忘了。
View Code
#include#include int main() { int i,k,l1,l2,ii,j,leap; char s1[1001],s2[1001]; while(gets(s1)!=NULL) { gets(s2); l1=strlen(s1); l2 = strlen(s2); leap =0; for(i= 0;i <= l1-l2;i++) //i是可以到l1-l2的它在l1-l2上在做一次比较 { ii = 0;j = 0; while(ii < l1&&j < l2) { if(s1[ii] == s2[j]) { ii++;j++; } else { ii = ii-j+1;j = 0; //ii从开始有相等的地方再次向后移动 } if(j == l2) //而不是l2-1 { leap = 1;break; } else leap=0; } if(leap) break; } if(leap == 0) { printf("NO\n"); } else { printf("YES\n"); } } } //算法功能:串的朴素模式匹配是最简单的一种模式匹配算法,又称为 Brute Force 算法,简称为BF算法 #include #include #define MAXL 255 #define FALSE 0 #define TRUE 1 typedef int Status; typedef unsigned char SString[MAXL+1]; //生成一个其值等于串常量strs的串T void StrAssign(SString &T, char *strs) { int i; T[0] = 0; //0号单元存储字串长度 for(i = 0; strs[i]; i++) //用数组strs给串T赋值 T[i+1] = strs[i]; T[0] = i; } //返回子串T在主串S中第pos个字符开始匹配的位置,若不存在,则返回0 int Index(SString S, SString T, int pos) { int i = pos, j = 1; while(i <= S[0] && j <= T[0]) { if(S[i] == T[j]) //继续比较后面的字符 { i++; j++; } else //指针回退,重新开始匹配 { i = i -j + 2; j = 1; } } if(j > T[0]) return i - T[0]; else return 0; } int main() { SString S, T; int m; char strs1[MAXL]; //建立主串S char strs2[MAXL]; //建立模式串T printf("请输入主串和子串:\n"); printf("主串S: "); scanf("%s", strs1); printf("子串T: "); scanf("%s", strs2); StrAssign(S, strs1); StrAssign(T, strs2); m = Index(S, T, 1); if(m) printf("主串 S = {%s}\n子串 T = {%s}\n在第 %d 个位置开始匹配!\n", strs1, strs2, m); else printf("主串 S = {%s}\n子串 T = {%s}\n匹配不成功!\n", strs1, strs2); return 0; }