字符串匹配--北航机试2008

来源:互联网 发布:全球宏观经济数据 编辑:程序博客网 时间:2024/05/17 01:09
题目描述:

    读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。

输入:

输入有多组数据。
每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。

输出:

输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。

样例输入:
4Aaba2BabABBa[a2b]b
样例输出:
1 Aab2 a2B

4 ABB

#include <iostream>#include<string>#include<stdio.h>using namespace std;const int Max =1010;string s[Max];string con[Max];int main(){    int n;    string temp,pre,middle,post;    int p1,p2;    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<n;i++)        {            cin>>s[i];            con[i]=s[i];            for(int j=0;j<s[i].size();j++) //转化为小写字母            {                if(s[i][j]>='a')                    con[i][j]-=32;            }        }        cin>>temp;        for(int j=0;j<temp.size();j++)        {            if(temp[j]>='a')  temp[j]-=32;        }        p1=temp.find('[');        if(p1==string::npos)        {            for(int i=0;i<n;i++)                if(s[i]==temp)                cout<<i+1<<' '<<s[i]<<endl;        }        else        {            p2=temp.find(']');            pre=temp.substr(0,p1);            middle =temp.substr(p1+1,p2-p1-1);            post=temp.substr(p2+1);            for(int i=0;i<n;i++)            {                if(con[i].substr(0,p1)==pre&&middle.find(con[i][p1])!=string::npos&&con[i].substr(p1+1)==post)                cout<<i+1<<' '<<s[i]<<endl;            }        }    }    return 0;}


0 0
原创粉丝点击