1063:字符串匹配问题

问题 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 
#include 
using namespace std;
const int N = 100;
void lower(char *s){//形参用指针,这样的话函数类型为void,不必返回值。
	int i;
	for (i = 0; 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;//防止意外情况,先初始化为0
	cin >> 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和s
			strcpy(newkey, key);
			strcpy(news, s[i]);//用strcpy函数,将原来的字符数组拷贝到新数组。在OJ系统用strcpy,在VS系统会提示用strcpy_s
			 lower(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;
}


 
 

你可能感兴趣的:(C++)