试题编号: 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;
}
}
}
}