您将获得一个字符串 pattern ,其中包含字符“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;
}
答案 0 :(得分: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;
}