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

时间:2017-04-02 06:01:27

标签: c++ c++11

  

您将获得一个字符串 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;
}

1 个答案:

答案 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;
}