• 字符串的匹配BF法


      1 #include <stdio.h>  
    2 #include<string.h>
    3 int main()
    4 {
    5 int i,k,l1,l2,ii,j,leap;
    6 char s1[1001],s2[1001];
    7 while(gets(s1)!=NULL)
    8 {
    9 gets(s2);
    10 l1=strlen(s1);
    11 l2 = strlen(s2);
    12 leap =0;
    13
    14 for(i= 0;i <= l1-l2;i++) //i是可以到l1-l2的它在l1-l2上在做一次比较
    15 {
    16 ii = 0;j = 0;
    17 while(ii < l1&&j < l2)
    18 {
    19 if(s1[ii] == s2[j])
    20 {
    21 ii++;j++;
    22 }
    23 else
    24 {
    25 ii = ii-j+1;j = 0; //ii从开始有相等的地方再次向后移动
    26 }
    27 if(j == l2) //而不是l2-1
    28 {
    29 leap = 1;break;
    30 }
    31 else
    32 leap=0;
    33
    34 }
    35 if(leap)
    36 break;
    37
    38
    39 }
    40 if(leap == 0)
    41 {
    42 printf("NO\n");
    43 }
    44 else
    45 {
    46 printf("YES\n");
    47 }
    48 }
    49 }
    50 //算法功能:串的朴素模式匹配是最简单的一种模式匹配算法,又称为 Brute Force 算法,简称为BF算法
    51
    52 #include <stdio.h>
    53 #include <stdlib.h>
    54 #define MAXL 255
    55 #define FALSE 0
    56 #define TRUE 1
    57
    58 typedef int Status;
    59 typedef unsigned char SString[MAXL+1];
    60
    61 //生成一个其值等于串常量strs的串T
    62 void StrAssign(SString &T, char *strs)
    63 {
    64 int i;
    65 T[0] = 0; //0号单元存储字串长度
    66 for(i = 0; strs[i]; i++) //用数组strs给串T赋值
    67 T[i+1] = strs[i];
    68 T[0] = i;
    69 }
    70
    71 //返回子串T在主串S中第pos个字符开始匹配的位置,若不存在,则返回0
    72 int Index(SString S, SString T, int pos)
    73 {
    74 int i = pos, j = 1;
    75 while(i <= S[0] && j <= T[0])
    76 {
    77 if(S[i] == T[j]) //继续比较后面的字符
    78 {
    79 i++;
    80 j++;
    81 }
    82 else //指针回退,重新开始匹配
    83 {
    84 i = i -j + 2;
    85 j = 1;
    86 }
    87 }
    88 if(j > T[0])
    89 return i - T[0];
    90 else
    91 return 0;
    92 }
    93
    94
    95 int main()
    96 {
    97 SString S, T;
    98 int m;
    99 char strs1[MAXL]; //建立主串S
    100 char strs2[MAXL]; //建立模式串T
    101 printf("请输入主串和子串:\n");
    102 printf("主串S: ");
    103 scanf("%s", strs1);
    104 printf("子串T: ");
    105 scanf("%s", strs2);
    106
    107 StrAssign(S, strs1);
    108 StrAssign(T, strs2);
    109
    110 m = Index(S, T, 1);
    111 if(m)
    112 printf("主串 S = {%s}\n子串 T = {%s}\n在第 %d 个位置开始匹配!\n", strs1, strs2, m);
    113 else
    114 printf("主串 S = {%s}\n子串 T = {%s}\n匹配不成功!\n", strs1, strs2);
    115 return 0;
    116 }
  • 相关阅读:
    BZOJ 2326 数学作业
    BZOJ 4448 情报传递
    BZOJ 4443 小凸玩矩阵
    BZOJ 1852 最长不下降序列
    BZOJ 4373 算术天才⑨与等差数列
    68285
    65656556
    D. Points in rectangle
    恐怖的怪物
    再战斐波那契
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2364044.html
Copyright © 2020-2023  润新知