zoukankan      html  css  js  c++  java
  • 字符串匹配

    问题描述

      给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
    输入格式
      输入的第一行包含一个字符串S,由大小写英文字母组成。
      第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
      第三行包含一个整数n,表示给出的文字的行数。
      接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
    输出格式
      输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
    样例输入
    Hello
    1
    5
    HelloWorld
    HiHiHelloHiHi
    GrepIsAGreatTool
    HELLO
    HELLOisNOTHello
    样例输出
    HelloWorld
    HiHiHelloHiHi
    HELLOisNOTHello
    样例说明
      在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
    评测用例规模与约定
      1<=n<=100,每个字符串的长度不超过100。
     
    #include <iostream>
    #include <string>
    using namespace std;
    
    int Index_BF(char S[], char T[], int choice)
    {
        /* 若串 S 中从第pos(S 的下标0≤pos个字符
        起存在和串 T 相同的子串,则称匹配成功,返回第一个
        这样的子串在串 S 中的下标,否则返回 -1    */
        int i = 0, j = 0;
        while (S[i + j] != ''&& T[j] != '')
        {
            char tmp = S[i+j];
            if (choice == 0)
            {
                if (S[i + j] >= 'A' && S[i + j] <= 'Z')
                    tmp = S[i + j] + 32;
            }
    
            if (tmp == T[j])
                j++; // 继续比较后一字符
            else
            {
                i++; j = 0; // 重新开始新的一轮匹配
            }
        }
        
        if (T[j] == '')
            return i; // 匹配成功   返回下标
        else
            return -1; // 串S中(第pos个字符起)不存在和串T相同的子串
    } // Index_BF
    
    struct Data{
        char str[100];
        bool flag;
        Data()
        {
            memset(str, 0, 100);
            flag = false;
        }
    };
    Data data[101];
    
    void main(void)
    {
        int n;
        int choice;
        char str[100];
        while (cin >> str)
        {
            cin >> choice;
            cin >> n;
            for (int i = 0; i < n; i++)
                cin >> data[i].str;
            if (choice == 0){
                int len = strlen(str);
                int i = 0;
                while (str[i] != '')
                {
                    if (str[i] >= 'A' && str[i] <= 'Z')
                        str[i] += 32;
                    i++;
                }
            }
            cout << endl;
            for (int j = 0; j < n; j++)
            {
                if (Index_BF(data[j].str, str, choice)!=-1)
                    cout << data[j].str << endl;
            }
            memset(str, 0, 100);
        }
    }

    对于模式匹配还可以用KMP算法,效率更好!

  • 相关阅读:
    进程和线程的概述
    注意两个词汇的区别:并行和并发
    WebRTC MCU( Multipoint Conferencing Unit)服务器调研
    (译)WebRTC实战: STUN, TURN, Signaling
    关于图数据库查询语言:Cypher
    Neo4j安装后的密码修改
    XYC2016上半年工作笔记整理
    WebRTC技术调研
    在Django中使用Neo4j
    传统企业做互联网的困局
  • 原文地址:https://www.cnblogs.com/tgycoder/p/4994794.html
Copyright © 2011-2022 走看看