题目描述
读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。
输入描述:
输入有多组数据。 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。
输出描述:
输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。
示例1
输入
复制
4 Aab a2B ab ABB a[a2b]b
输出
复制
1 Aab 2 a2B 4 ABB
题目理解:匹配全部的字符串,方括号中的内容是可选,
不区分大小写的匹配,我的做法是把两个字符,如果是小写就转换成大写,然后再进行匹配= =
核心部分代码是
for(int i=0;i<n;i++){
int j=0;
int k=0; //指示匹配字符串
string s2=str[i];
while(s2[j]){
if(pattern[k]=='['){
while(pattern[++k]!=']'){
if(isEqual(pattern[k],s2[j])) //不区分大小写的匹配
break;
}
if(pattern[k]==']')
break;
else //有一个字母匹配所以跳出了
while(pattern[++k]!=']'); //就是一直跳过]
}
else{
if(!isEqual(pattern[k],s2[j])){
break;
}
}
j++;
k++;
}
if(!pattern[k] && !s2[j]){
cout<<i+1<<" "<<s2<<endl;
}
}
AC代码是
#include<iostream>
#include <string>
#include <vector>
#include <string.h>
using namespace std;
int n;
char pattern[30];
vector<string> str;
bool isEqual(char a,char b){
//把小写字母都改成大小
if(a>='a' && a<='z'){
a=a-'a'+'A';
}
if(b>='a' && b<='z'){
b=b-'a'+'A';
}
if(a==b)
return true;
else
return false;
}
int main(){
cin>>n;
string s1;
for(int i=0;i<n;i++){
cin>>s1;
str.push_back(s1);
}
cin>>pattern;
//开始匹配
for(int i=0;i<n;i++){
int j=0;
int k=0; //指示匹配字符串
string s2=str[i];
while(s2[j]){
if(pattern[k]=='['){
while(pattern[++k]!=']'){
if(isEqual(pattern[k],s2[j])) //不区分大小写的匹配
break;
}
if(pattern[k]==']')
break;
else //有一个字母匹配所以跳出了
while(pattern[++k]!=']'); //就是一直跳过]
}
else{
if(!isEqual(pattern[k],s2[j])){
break;
}
}
j++;
k++;
}
if(!pattern[k] && !s2[j]){
cout<<i+1<<" "<<s2<<endl;
}
}
return 0;
}