201409-3 字符串匹配
题目
思路
本来用的stl,写一半发现不会大小写转换,只好自己暴力匹配了。(我是不会说出来我不会kmp的!)
题目的数据规模小,暴力匹配完全没问题。不过我还是觉得string类好用,find函数有多好谁用谁知道。(见下方stl代码)
由于输出的是原始字符串,所以我用一个origin把大小写转换前的字符串保存了下来。
其实也可以直接在匹配的时候考虑大小写,这样就不用改动原字符串了。
AC代码如下
#include<cstdio>
char pat[105],text[105],origin[105];
int flag,n;
void change(char str[]){//大小写转换
if(flag) return ;//在change函数里判断要不要转换
int i=0;
while(str[i]!='\0'){
origin[i]=str[i];
if(str[i]>='A'&&str[i]<='Z') str[i]=str[i]-'A'+'a';
i++;
}
origin[i]='\0';
}
bool included(char t[],char p[]){//匹配
int i=0;
while(t[i]!='\0'){
if(t[i]==p[0]){//如果第一个字符对上了,则对比之后的字符
int j=0,temp=i;
while(t[temp]!='\0'&&t[temp]==p[j]){
temp++;
j++;
if(p[j]=='\0') return true;
}
}
i++;
}
return false;
}
int main(){
scanf("%s",pat);
scanf("%d%d",&flag,&n);
change(pat);
while(n--){
getchar();//需要把回车吃掉
scanf("%s",text);
change(text);
if(included(text,pat)){
if(flag) puts(text);
else puts(origin);
}
}
return 0;
}
然后这是我学了transform函数后用stl写的代码
跟我一起喊,stl牛逼!
#include<iostream>
#include<string>
#include<algorithm>//transform函数在algorithm里
using namespace std;
int main(){
string pat,text;
cin>>pat;
int flag,n;
cin>>flag>>n;
if(!flag) transform(pat.begin(),pat.end(),pat.begin(),::tolower);
getchar();
while(n--){
cin>>text;
string temp=text;
if(!flag) transform(temp.begin(),temp.end(),temp.begin(),::tolower);
if(temp.find(pat)!=string::npos) cout<<text<<endl;
}
return 0;
}
(2019.9.9)
初学正则表达式
#include<iostream>
#include<string>
#include<regex>
using namespace std;
int main(){
string pat,text;
cin>>pat;
int flag,n;
cin>>flag>>n;
pat="[[:alpha:]]*"+pat+"[[:alpha:]]*";
regex r;
if(flag==0) r.assign(pat,regex::icase);
else r.assign(pat);
smatch results;
while(n--){
cin>>text;
if(regex_search(text,results,r))
cout<<text<<endl;
}
return 0;
}