在某些情况下,通配符模式匹配失败

Wildcard Pattern Matching fails for some cases

本文关键字:通配符 模式匹配 失败 情况下      更新时间:2023-10-16

你会得到一个字符串模式,它由字符'a'到'z'和一个星号字符('*')组成,表现为通配符。通配符匹配零个或多个任意字符。通配符可能位于模式字符串的前面、后面或中间。

给定一个整数 N,后跟 N 个字符串。您的任务是查找哪些字符串与模式匹配。

示例输入:

pl*
3
play
pluck
prune

示例输出:

play
pluck

这是我的代码。方法是找到星号在模式字符串中的位置,并将星号之前的模式子字符串与测试字符串的前 # 个字符进行比较,并将星号后面的模式子字符串与测试字符串的最后 # 个字符进行比较。

它几乎完美运行,但有一个测试用例输出了错误的答案。我试图想出一些随机案例,但这一切都按预期工作。我还不知道导致我的代码出错的情况。你能帮我找到这些案例或指出我的代码中的一些错误吗?谢谢

#include <iostream>
#include <string>
using namespace std;
int main(){
string pattern;
cin >> pattern;
int patternLen = pattern.length();
int asterPos = pattern.find('*');
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
string temp;
cin >> temp;
int tempLen = temp.length();
bool verdict;
if (tempLen >= patternLen - asterPos - 1) {
verdict = (temp.substr(0, asterPos) == pattern.substr(0, asterPos)) && (temp.substr(tempLen - patternLen + asterPos + 1) == pattern.substr(asterPos + 1));
} else {
verdict = false;
}
if (verdict) {
cout << temp << 'n';
}
}
return 0;
}

我发现了一个反例:

ab*ca
1
abc

这不应该匹配,但它确实匹配。

错误存在于匹配字符串的子字符串中,因为在某些情况下它们可以重叠,这不应该发生(在本例中为"ab"和"bc")。

因此,必须在if语句中提出另一个条件以防止子字符串重叠。非重叠子字符串的总长度应大于或等于不带星号的模式字符串。

因此,该声明将是:

if ((tempLen >= asterPos) && (tempLen >= patternLen - asterPos - 1) && (tempLen >= patternLen - 1)) {
verdict = (temp.substr(0, asterPos) == pattern.substr(0, asterPos)) && (temp.substr(tempLen - patternLen + asterPos + 1) == pattern.substr(asterPos + 1));
} else {
verdict = false;
}