题解 | #字符串通配符#

字符串通配符

https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

#include <iostream>
#include <vector>
#include <cctype>
using namespace std;

// 判断两个字符是否相等(不区分大小写)
bool charEquals(char a, char b) {
    return tolower(a) == tolower(b);
}

// 判断字符是否为英文字母或数字
bool isValidChar(char c) {
    return isalnum(c);  // isalnum 用于判断字符是否为字母或数字
}

// 实现通配符匹配
bool isMatch(const string& pattern, const string& str) {
    int m = pattern.size();
    int n = str.size();

    // dp[i][j] 表示 pattern 的前 i 个字符与 str 的前 j 个字符是否匹配
    vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));

    // 初始化 dp[0][0] 为 true,因为空模式和空字符串是匹配的
    dp[0][0] = true;

    // 处理 pattern 以 '*' 开始的情况,* 可以匹配空字符串
    for (int i = 1; i <= m; i++) {
        if (pattern[i - 1] == '*') {
            dp[i][0] = dp[i - 1][0];
        }
        else {
            break;
        }
    }

    // 填充 dp 表格
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (pattern[i - 1] == '*') {
                // '*' 可以匹配零个或多个字符
                dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
            }
            else if (pattern[i - 1] == '?') {
                // '?' 必须匹配一个英文字母或数字
                dp[i][j] = dp[i - 1][j - 1] && isValidChar(str[j - 1]);
            }
            else {
                // 普通字符匹配,区分大小写
                dp[i][j] = dp[i - 1][j - 1] && charEquals(pattern[i - 1], str[j - 1]);
            }
        }
    }

    // 返回最终结果
    return dp[m][n];
}

int main() {
    string pattern, str;
    while (cin >> pattern >> str) {
        if (isMatch(pattern, str)) {
            cout << "true" << endl;
        }
        else {
            cout << "false" << endl;
        }
    }
    return 0;
}

全部评论

相关推荐

用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务