1597 - 字符串匹配2

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

题目输入


输入有多组数据。<br />

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

<br />

题目输出


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

<br />

输入/输出样例

题目输入

4
aabb
aaaa
abbb
aaab
a[ab]bb

题目输出

1 aabb
3 abbb

C语言解答

#include<stdio.h>
#include<string.h>
int cmpch(char a,char b)
{
	if('0'<=a&&a<='9'&&a==b)
		return 1;
	if('a'<=a&&a<='z'&&(a==b||a-32==b))
		return 1;
	if('A'<=a&&a<='Z'&&(a==b||a+32==b))
		return 1;
	return 0;
}
int main()
{
	int i,j,k,n,len1,len2,mark;
	char str[100][100];
	char arr[100];
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
			scanf("%s",str[i]);
		scanf("%s",arr);
		len2=strlen(arr);
		for(i=0;i<n;i++)
		{
			len1=strlen(str[i]);
			for(j=0,k=0;j<len1,k<len2;j++,k++)
			{
				if(cmpch(str[i][j],arr[k]))
					continue;
				else
				{
					if(arr[k]!='[')
						break;
					else
					{
						mark=0;
						k++;
						while(arr[k]!=']')
						{
							if(cmpch(str[i][j],arr[k]))
								mark=1;
							k++;
						}
						if(mark==0)
							break;
					}
				}
			}
			if(j==len1&&k==len2)
				printf("%d %s\n",i+1,str[i]);
		}
	}
	return 0;
}

C++解答

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

bool is_equal(char a, char b)
{
        if(a == b)
                return true;
        else if(a < b && a >= 'A' && a <= 'Z' && b - a == 'a' - 'A')
                return true;
        else if(b < a && b >= 'A' && b <= 'Z' && a - b == 'a' - 'A')
                return true;
        else
                return false;
}

int main()
{
              int num, i, j;
        string s, pattern;
        vector<string> vec;
        while(cin >> num){
                vec.clear();
                while(num--){
                        cin >> s;
                        vec.push_back(s);
                }
                cin >> pattern;
                for(int k = 0; k < vec.size(); k++){
                        s = vec[k];
                        bool match = true;
                        for(i = 0, j = 0; i < s.length(); i++, j++){
                                if(pattern[j] == '['){
                                        bool m = false;
                                        char c = pattern[++j];
                                        while(c != ']'){
                                                if(is_equal(s[i], c)){
                                                        m = true;
                                                }
                                                c = pattern[++j];
                                        }
                                        if(!m){
                                                match = false;
                                                break;
                                        }
                                }
                                else{
                                        if(!is_equal(s[i], pattern[j])){
                                                match = false;
                                                break;
                                        }
                                }
                        }
                        if(match && j >= pattern.length()){
                                cout << k + 1 << " " << s << endl;
                        }
                }
        }
        return 0;
        
} 

时间限制 1 秒
内存限制 32 MB
讨论 统计
上一题 下一题