201409-3字符串匹配

一、原题

问题描述

试题编号: 201409-3
试题名称: 字符串匹配
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述

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

输入格式

  输入的第一行包含一个字符串S,由大小写英文字母组成。
  第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
  第三行包含一个整数n,表示给出的文字的行数。
  接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。

输出格式

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

样例输入

Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

样例输出

HelloWorld
HiHiHelloHiHi
HELLOisNOTHello

样例说明

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

评测用例规模与约定

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

二、解答

电脑没装编译器,还要下载,尽管现在这种for循环编程没什么用了,因为太慢,矩阵或者张量有加速,但是还是写写比较有趣。反正我就是这么做了,不需要理由。

这是一道签到题。我不会高级的那种O(n+m)的方法,只会这种O(n*m)的native想法。不解释,太简单了,一个一个地比对就行了,大小写不是问题,大不了两份数据,一份用来输出,一份用来判断。有谁能几句话把那个厉害地O(n+m)字符匹配算法说明白而且完整,能够从语言文字映射到代码,让人记忆深刻地大神们请私聊或者在评论区发表。

ok,开编译器了,因为实际考试是没法知道自己对不对的,只能通过编译器猜测。写错了一行,falg初始值被我设置成了1,应该是0.

检查发现else没写。。arr是空的。

第一次错误,只得了50分。果然我垃圾,开编译器都不知道自己哪里错了。发现哪里错了,参数为0时不输出???

///一定要牢记toupper和tolower,实在太长用了!!!要不然写的就像我的那么难看还容易出bug。

今天这题坑死我了。现学了好多东西。

一、string必须resize之后才能用下标,不然一直是空的。

二、transform真好用,直接给string变成小写的了。

三、一定要有自己的测试样例,从题目推出来应该测试哪些情况。到时候不知道自己正确还是错误的,需要数据检验。

四、string的length和size是一个东西,名字不一样而已。

/***
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

Hello
0
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
***/
#include <iostream>
#include <ctype.h>
#include <string>
#include <algorithm>
using namespace std;
int main(){
string s;
cin>>s;
unsigned int Aa,n;
cin>>Aa;
cin>>n;
unsigned int i,j,k;
string arr0[100];
for(i=0;i<n;i++){
cin>>arr0[i];
}
string arr[100];
string ss;
if(Aa==0){
///not only arr,but also s
ss.resize(s.size());
transform(s.begin(),s.end(),ss.begin(),::tolower);
for(i=0;i<n;i++){
arr[i].resize(arr0[i].size());
transform(arr0[i].begin(),arr0[i].end(),arr[i].begin(),::tolower);
}
}else{
for(i=0;i<n;i++){
arr[i]=arr0[i];
}
ss=s;
}
int flag[100]={};
for(i=0;i<n;i++){
for(j=0;j<arr[i].length();j++){
for(k=0;k<ss.length();k++){
if(arr[i][j+k]!=ss[k]){
break;
}
}
///cout<<k<<" "<<s.length()<<endl;
if(k==ss.length()){
flag[i]=1;
break;
}
}
}
for(i=0;i<n;i++){
if(flag[i]){
cout<<arr0[i]<<endl;
}
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/SiKongPop/article/details/81432810