当前位置: 代码迷 >> 综合 >> 1063:字符串匹配问题
  详细解决方案

1063:字符串匹配问题

热度:58   发布时间:2023-12-06 11:51:06.0

问题 E: 字符串匹配问题

时间限制: 1 Sec   内存限制: 256 MB
提交: 1046   解决: 373
[ 提交][ 状态][ 讨论版]

题目描述

给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

输入

输入的第一行包含一个字符串S,由大小写英文字母组成。 

  第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。 

  第三行包含一个整数n,表示给出的文字的行数。 

  接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。

输出

 输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。

样例输入

Hello15HelloWorldHiHiHelloHiHiGrepIsAGreatToolHELLOHELLOisNOTHello

样例输出

HelloWorldHiHiHelloHiHiHELLOisNOTHello  

提示

样例说明 

 在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。 

评测用例规模与约定 

1<=n<=100,每个字符串的长度不超过100。


思路分析:
大小写敏感:如果不敏感,可以将输入的字符全部转化为小写或者大写进行比较,输出时依然是原字符串。
比较:可以使用strstr函数,会变得简便许多。这个函数会返回a字符串首次在b字符串中出现的位置,因而可判断b是否包含a。
代码:
#include <iostream>
#include <string.h>
using namespace std;
const int N = 100;
void lower(char *s){//形参用指针,这样的话函数类型为void,不必返回值。int i;for (i = 0; i <strlen(s); i++){if (s[i] >= 'A'&&s[i] <= 'Z')s[i] = s[i] - 'A' + 'a';//全部转化为小写字母。}}
int main(){char key[N];//这是待查找的关键字符串int n;int i;int sen =1;//大小写敏感的选项,默认敏感char s[N][N];//这是即将输入的待查找的字符串for (n = 0; n < N; n++)for (i = 0; i < N; i++)s[n][i] = 0;//防止意外情况,先初始化为0cin >> key;cin >> sen;cin >> n;for (i = 0; i < n; i++){cin >> s[i];//输入字符串,换行符为间隔}for (i = 0; i < n; i++){if (sen == 0)//如果大小写不敏感{char newkey[N];char news[N];//创建新的字符数组,用于存放key和sstrcpy(newkey, key);strcpy(news, s[i]);//用strcpy函数,将原来的字符数组拷贝到新数组。在OJ系统用strcpy,在VS系统会提示用strcpy_slower(key);lower(s[i]);//将原字符串全部转化为小写if (strstr(s[i], key) != NULL)//只要在s[i]中查找到key,返回值就不为空cout << news << endl;//这时候愉快地输出包含key的字符串news(注意不是s,不然就是全部小写了)}else	if (strstr(s[i],key)!=NULL)//大小写敏感更加简单,直接调用strstr函数即可cout << s[i] << endl;}system("pause");return 0;
}