【CCFCSP】201409-3 字符串匹配

試題編號: 201409-3
試題名稱: 字符串匹配
時間限制: 1.0s
內存限制: 256.0MB

這是一道基礎的字符串匹配問題,可以使用遍歷的方法判斷一字符串是否被另一字符串包含。這裏把被判斷字符串記作a,如果要判斷a串是否在b串中,可以枚舉b串中第一個和a匹配的位置,然後再判斷是否a整個串都和b串的剩餘字符匹配。
對於不區分大小寫的情況,可以把a和b字符串都轉換爲小寫形式,之後的判斷與不區分大小寫相同。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
//a表示被判斷串,b表示需要判斷包含a的串
//a1,b1表示轉化後的a和b串
char a[110], a1[110], b[110], b1[110];
using namespace std;
int main() {
    int n, len1, len2;
    bool s;
    cin >> a >> s >> n;
    len1 = strlen(a);
    while (n--) {
        memset(a1, 0, sizeof(a1));
        memset(b1, 0, sizeof(b1));
        for (int i = 0; i < len1; i++) {
            if (a[i] >= 'A'&&a[i] <= 'Z' && !s) {
                //如果不區分大小寫且是大寫字符,進行轉化
                a1[i] = a[i] + 32;
            }
            else {
                //如果不區分大小寫或本來就是小寫字符,就不需要轉化,直接複製
                a1[i] = a[i];
            }
        }
        cin >> b;
        len2 = strlen(b);
        if (len2 < len1) continue;
        for (int i = 0; i < len2; i++) {
            if (b[i] >= 'A'&&b[i] <= 'Z' && !s) {
                b1[i] = b[i] + 32;
            }
            else
                b1[i] = b[i];
        }
        //b串開始位置只需要判斷到len2-len1(因爲之後不可能匹配)
        for (int i = 0; i <= len2 - len1; i++) {
            bool flag = 0;
            //判斷是否a整串都與b剩餘的字符匹配
            for (int j = 0; j < len1; j++) {
                if (a1[j] != b1[i + j]) {
                    flag = 1;//flag=1表示匹配失敗
                    break;
                }
            }
            if (!flag) {
                //如果匹配成功就輸出原串
                cout << b << endl;
                break;
            }
        }

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章