zoukankan      html  css  js  c++  java
  • CCF2014093字符串匹配(C语言版)

    问题描述
      给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
    输入格式
      输入的第一行包含一个字符串S,由大小写英文字母组成。
      第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
      第三行包含一个整数n,表示给出的文字的行数。
      接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
    输出格式
      输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
    样例输入
    Hello
    1
    5
    HelloWorld
    HiHiHelloHiHi
    GrepIsAGreatTool
    HELLO
    HELLOisNOTHello
    样例输出
    HelloWorld
    HiHiHelloHiHi
    HELLOisNOTHello
    样例说明
      在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
    评测用例规模与约定
    1<=n<=100,每个字符串的长度不超过100。
      
    解题思路:
    此题关键是要在测试字符串s[i]中找到一段子串和对照字符串testS[]相匹配,这里将两个要比较的字符串上下排列,将待测试字符串按每次一个字符的移动速度向左边移动,始终对照两字符串位置相对应的字符,若完全匹配,则表示命中,打印测试字符串。拖动测试字符串情形见下图:
    另外对于题中“选项关闭”的情形,将对照字符串和测试字符串都一律转换成大/小写字母后,仍然按照上述步骤进行匹配就行。
    代码如下:
     1 #include<stdio.h>
     2 #include<string.h>
     3 
     4 char s[101][101];
     5 
     6 int main()
     7 {
     8     int i ,k , n , flag,len;//flag为开关 
     9     char testS[101];//对照字符串 
    10     scanf("%s",testS);
    11     len = strlen(testS);
    12     scanf("%d",&flag);
    13     scanf("%d",&n);
    14     for(i = 0 ; i< n ; i++)//循环输入测试字符串 
    15        scanf("%s",&s[i]);
    16     for(i = 0 ; i < n ; i++)
    17     {
    18         int j=0;//局部变量,只在循环里使用,每次对照测试字符串都需要初始化 
    19         if(flag == 1){
    20             for(k = 0;k < strlen(s[i]) ; k++)
    21             {
    22                 if(s[i][k] == testS[j])//两个字符串中的字母比较,如果相等则比较下一个字母 (j++,k++) 
    23                     j ++;
    24                 else//若遇到不相同的字母,则将对照的字符串testS下标初始化,从0继续开始 
    25                     j=0;
    26                 if(j >= len){//若对照字符串和测试字符串连续有 len = strlen(testS)个相同,则打印测试字符串 
    27                     printf("%s\n",s[i]);
    28                     break;
    29                 }
    30             }
    31         }
    32         else if(flag==0){//当 选项关闭时,将对照字符串和测试字符串都转化为小写字母比较 
    33             char s1[101][101] ={0};//存储转化后的测试字符串数组 
    34             char testS1[101] = {0};//存储转化后的对照字符串 
    35             for(k= 0;k <= len ; k++ )
    36             {
    37                 if(testS[k] >='A' && testS[k] <='Z')
    38                     testS1[k] =testS[k] + 32;
    39                 else testS1[k] =testS[k];
    40             }
    41             for(k= 0;k <= strlen(s[i]) ; k++ )
    42             {
    43                 if(s[i][k] >='A' && s[i][k] <='Z')
    44                     s1[i][k] =s[i][k]+ 32;
    45                 else s1[i][k] =s[i][k];
    46             }
    47             for(k = 0;k <= strlen(s[i]) ; k++)//这段代码和上面重复,注意比较的是转化后的字符串,输出的是原字符串 
    48             {
    49                 if(s1[i][k] == testS1[j])
    50                     j ++;
    51                 else
    52                     j = 0;
    53                 if(j >= len){
    54                     printf("%s\n",s[i]);
    55                     break;
    56                 }
    57             }
    58         }
    59     }
    60     return 0 ;
    61  } 
  • 相关阅读:
    6 完全平方数相关
    5 三位数,每个位置不同
    Neo4j Admin Import 导入多个node和relationship
    Rust所有权
    Rust 多态
    Rust 泛型
    Rust trait
    Rust模块化
    Spring Cloud(Dalston.SR1)
    git 速度慢问题解决
  • 原文地址:https://www.cnblogs.com/roadofstudy/p/6544580.html
Copyright © 2011-2022 走看看