写代码是一种艺术,甚于蒙娜丽莎的微笑!

不拼搏,枉少年!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

问题描述

  给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
  输入的第一行包含一个字符串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] != '\0'&& T[j] != '\0')
    {
        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] == '\0')
        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] != '\0')
            {
                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算法,效率更好!

posted on 2015-11-25 15:20  RunningSnail  阅读(919)  评论(0编辑  收藏  举报