zoukankan      html  css  js  c++  java
  • 字符串朴素匹配 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;  
        }  
  • 相关阅读:
    三步完成自适应网页设计
    EasyUI DataGrid 修改每页显示数量的最大值&&导出Grid到Excel
    EasyUI DataGrid 实用例子(2015-05-22)
    C# 如何将List拆分成多个子集合
    EasyUI Tabs绑定右键
    微信支付-扫码支付备忘
    微信支付:模板消息实现过程备忘
    4、http协议之二
    1、套按字及http基础知识之一
    3、Web server 之httpd2.2 配置说明
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2513758.html
Copyright © 2011-2022 走看看