程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 題目1165:字符串匹配

題目1165:字符串匹配

編輯:C++入門知識

前言
本來想看道題目直接睡覺,再看他人解答前看到說這道題是北航上機題目,當時做出來的人很少,因此我就按耐不住激動的心情,遇到這種題目,我必須自己ac啊,中間跟一個同學講了一下git的使用,浪費了一些時間,從調試到ac花費了大約40多分鐘吧,走神了一段時間,畢竟開始做題已經晚上1點了,難免精力不集中


開始時間:

 \
 


結束時間:

 \
 


ac過程:

 \
 


題目
[html]
題目描述: 
    讀入數據string[ ],然後讀入一個短字符串。要求查找string[ ]中和短字符串的所有匹配,輸出行號、匹配字符串。匹配時不區分大小寫,並且可以有一個用中括號表示的模式匹配。如“aa[123]bb”,就是說aa1bb、aa2bb、aa3bb都算匹配。 
輸入: 
輸入有多組數據。 
每組數據第一行輸入n(1<=n<=1000),從第二行開始輸入n個字符串(不含空格),接下來輸入一個匹配字符串。 
輸出: 
輸出匹配到的字符串的行號和該字符串(匹配時不區分大小寫)。 
樣例輸入: 

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
****************************************************************/

 

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved