【CCFCSP】201409-3 字符串匹配

试题编号: 201409-3
试题名称: 字符串匹配
时间限制: 1.0s
内存限制: 256.0MB

这是一道基础的字符串匹配问题,可以使用遍历的方法判断一字符串是否被另一字符串包含。这里把被判断字符串记作a,如果要判断a串是否在b串中,可以枚举b串中第一个和a匹配的位置,然后再判断是否a整个串都和b串的剩余字符匹配。
对于不区分大小写的情况,可以把a和b字符串都转换为小写形式,之后的判断与不区分大小写相同。

#include
#include
#include
#include
#include
#include
#include
//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;
            }
        }

    }
}

你可能感兴趣的:(CCFCSP)