要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
?:匹配1个字符
输入:
通配符表达式;
一组字符串。
输出:
返回匹配的结果,正确输出true,错误输出false
#include <iostream>
#include <string>
using namespace std;
void check(string A, string B) {
int i = 0, j = 0;
int count = 0;//为0表示在A中未发现'*'
while (i < A.size() && j < B.size()) {
if (A[i] == '*') {//发现'*'时,A,B指向下一个字符
j++;
i++;
count = 1;//'*'标记
}
else if (A[i] == '?') {//出现'?'时,匹配到一个字符串
i++;
j++;
}
else {//当A中字符为普通字符时
if (count == 0) {//没有'*',若字符不相等,则不匹配
if (A[i] != B[j]) {
cout << "false" << endl;
return;
}
else//字符相等,指向下一字符
i++;
j++;
}
else if (count == 1) {
if (A[i] == B[j]) {
//有'*',若相等,则表示匹配了0个字符,跳过当前循环,去判断下一个字符
count = 0;
continue;
}
while (j < B.size() && A[i] != B[j]) {
//有'*',不相等,则B指向下一个字符,表示当前'*'匹配了多个字符
j++;
count = 0;
}
}
}
}
//当A或B中字符已匹配完,去判断剩余的字符
while (i < A.size()) {
//A中还有字符,则必为'*'
if (A[i] != '*' ) {
cout << "false" << endl;
}
i++;
}
while (j < B.size()) {
//B中还有字符,若不为'*',则匹配失败
if (A[i] != '*')
cout << "false" << endl;
return;
}
cout << "true" << endl;
}
int main() {
string A;
string B;
while (cin >> A >> B) {
check(A, B);
}
return 0;
}