在某些情况下,通配符模式匹配失败
Wildcard Pattern Matching fails for some cases
你会得到一个字符串模式,它由字符'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;
}
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 当使用通配符和null指针调用函数时,对输出的说明
- C++17 文件系统::remove_all 带有通配符路径
- 如何允许通配符模板参数
- 使用通配符的跨平台文件列表
- 如何检索由带通配符的字符串索引的对象
- 有效地查找通配符条目
- 具有不同输入和输出名称的生成文件通配符
- MinGW GCC通配符编译所有文件(Windows)
- Windows 上带有通配符的目录中的文件
- 查找第一个文件W通配符匹配
- 在某些情况下,通配符模式匹配失败
- 实现通配符后没有输入文件错误
- “使”找不到具有通配符模式的目标
- 如何在C++的目录中查找具有通配符匹配的最后一个修改文件
- 学习提升::正则表达式,匹配通配符
- QRegularExpression通配符匹配
- 通配符匹配递归算法
- 计算与通配符匹配的下一个最近日期时间
- 通配符模式匹配中的分割错误