【华为机考练习】HJ71 字符串通配符

这题较难。使用递归DFS容易导致超时,使用DP有许多需要注意的地方。该题的牛客网题解大多数没有考虑全面,这里给出我的解法。

1. *的匹配需要注意边界情况。

2. *和?只能匹配字母和数字。

3. 大小写不敏感

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

bool dp[101][101];

int main()
{
    string a, b;

    while (cin >> a >> b)
    {
        // 全部转为小写
        transform(a.begin(), a.end(), a.begin(), ::tolower);
        transform(b.begin(), b.end(), b.begin(), ::tolower);

        // 处理边界情况,a和b在最前面加上一个字符'x',表示字符串为空的情况
        a = 'x' + a;
        b = 'x' + b;

        dp[0][0] = true;    // 两边都为空,则为true

        // 一个*或者多个*,可以匹配空字符
        for (int i = 1; i < a.length(); ++i)
            dp[i][0] = dp[i - 1][0] && (a[i] == '*');

        for (int i = 1; i < a.length(); ++i)
        {
            for (int j = 1; j < b.length(); ++j)
            {
                if (a[i] == '*')
                {
                    if (isalnum(b[j]))  // 如果b[j]是数字或者字母
                        dp[i][j] = dp[i - 1][j] || dp[i][j - 1];        // *可以不参与匹配,也可以匹配它
                    else
                        dp[i][j] = dp[i - 1][j];                        // 否则,*只能不参与匹配
                }
                else if (a[i] == '?' && isalnum(b[j]))      // ?只能参与匹配字母或数字
                    dp[i][j] = dp[i - 1][j - 1];
                else if (a[i] == b[j])                      // 如果两个字符相等,那么匹配他们
                    dp[i][j] = dp[i - 1][j - 1];
                else                                        // 两个字符不相等,那么只能false了
                    dp[i][j] = false;
            }
        }

        if (dp[a.length() - 1][b.length() - 1])
            cout << "true" << endl;
        else
            cout << "false" << endl;
    }

    return 0;
}

如果对你有帮助,记得点个赞哦~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值