题目1165:字符串匹配

来源:互联网 发布:电脑程序编程入门 编辑:程序博客网 时间:2024/05/29 03:56

前言

本来想看道题目直接睡觉,再看他人解答前看到说这道题是北航上机题目,当时做出来的人很少,因此我就按耐不住激动的心情,遇到这种题目,我必须自己ac啊,中间跟一个同学讲了一下git的使用,浪费了一些时间,从调试到ac花费了大约40多分钟吧,走神了一段时间,毕竟开始做题已经晚上1点了,难免精力不集中

开始时间:


结束时间:


ac过程:


题目

题目描述:    读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。输入:输入有多组数据。每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。输出:输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。样例输入:4Aaba2BabABBa[a2b]b样例输出:1 Aab2 a2B4 ABB

ac代码

太晚了,不讲思路了,也没什么难度,就是模拟一下正则

#include <stdio.h>#include <stdlib.h>#include <string.h> #define MAX 1001#define LEN 101 struct str{    char name[101];}; int main(){    struct str strs[MAX];    struct str t[LEN];    int i, n, len, j, k, left, right, count, flag;    char text[LEN], newtext[LEN];     while (scanf("%d", &n) != EOF) {        // 接收数据        getchar();        for (i = 0; i < n; i ++) {            scanf("%s", strs[i].name);        }         // 接收文本串        getchar();        gets(text);        len = strlen(text);         for (i = left = right = 0; i < len; i ++) {            if (text[i] == '[') {                left = i;            } else if (text[i] == ']') {                right = i;                break;            }        }        count = right - left - 1;         if (count <= 0) {    // 没有正则匹配            for (i = j = 0; i < len; i ++) {                if (text[i] != '[' && text[i] != ']') {                    newtext[j ++] = text[i];                }            }            newtext[j] = '\0';            for (i = 0; i < n; i ++) {                if (strcasecmp(strs[i].name, newtext) == 0) {                    printf("%d %s\n", i + 1, strs[i].name);                }            }        }else { // 需要正则匹配            for (j = 1, k = 0; j <= count; j ++, k ++) { // 构建文本数组                memset(t[k].name, '\0', sizeof(t[k].name));                for (i = 0; i < left; i ++) {                    t[k].name[i] = text[i];                }                t[k].name[i] = text[left + j];                strcat(t[k].name, text + right + 1);                }                        // 正则匹配             for (i = 0; i < n; i ++) {                for (j = flag = 0; j < count; j ++) {                    if (strcasecmp(strs[i].name, t[j].name) == 0) {                        flag = 1;                        break;                    }                }                if (flag) {                    printf("%d %s\n", i + 1, strs[i].name);                }            }        }     }     return 0;}/**************************************************************    Problem: 1165    User: wangzhengyi    Language: C    Result: Accepted    Time:0 ms    Memory:948 kb****************************************************************/




原创粉丝点击