前言
本來想看道題目直接睡覺,再看他人解答前看到說這道題是北航上機題目,當時做出來的人很少,因此我就按耐不住激動的心情,遇到這種題目,我必須自己ac啊,中間跟一個同學講了一下git的使用,浪費了一些時間,從調試到ac花費了大約40多分鐘吧,走神了一段時間,畢竟開始做題已經晚上1點了,難免精力不集中
開始時間:
結束時間:
ac過程:
題目
[html]
題目描述:
讀入數據string[ ],然後讀入一個短字符串。要求查找string[ ]中和短字符串的所有匹配,輸出行號、匹配字符串。匹配時不區分大小寫,並且可以有一個用中括號表示的模式匹配。如“aa[123]bb”,就是說aa1bb、aa2bb、aa3bb都算匹配。
輸入:
輸入有多組數據。
每組數據第一行輸入n(1<=n<=1000),從第二行開始輸入n個字符串(不含空格),接下來輸入一個匹配字符串。
輸出:
輸出匹配到的字符串的行號和該字符串(匹配時不區分大小寫)。
樣例輸入:
4
Aab
a2B
ab
ABB
a[a2b]b
樣例輸出:
1 Aab
2 a2B
4 ABB
題目描述:
讀入數據string[ ],然後讀入一個短字符串。要求查找string[ ]中和短字符串的所有匹配,輸出行號、匹配字符串。匹配時不區分大小寫,並且可以有一個用中括號表示的模式匹配。如“aa[123]bb”,就是說aa1bb、aa2bb、aa3bb都算匹配。
輸入:
輸入有多組數據。
每組數據第一行輸入n(1<=n<=1000),從第二行開始輸入n個字符串(不含空格),接下來輸入一個匹配字符串。
輸出:
輸出匹配到的字符串的行號和該字符串(匹配時不區分大小寫)。
樣例輸入:
4
Aab
a2B
ab
ABB
a[a2b]b
樣例輸出:
1 Aab
2 a2B
4 ABB
ac代碼
太晚了,不講思路了,也沒什麼難度,就是模擬一下正則
[cpp]
#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
****************************************************************/
#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
****************************************************************/