字符串朴素匹配 BF法

这是我原来51cto上博客移植过来的。凑合看吧。不过真的忘了。
View Code
    #include <stdio.h>  
    #include<string.h>  
    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 <stdio.h>  
    #include <stdlib.h>  
    #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;  
    }  
原文地址:https://www.cnblogs.com/0803yijia/p/2513758.html