题解

题目难度:中等

知识点:查找、递归

解题思路:整道题其实不难,在题目的描述过程中需要读懂题意。其实就是一道字符匹配的题,整个过程只要依次对字符串m和s进行对比就可以了。稍微不一样的地方时'*'代表的含义,所以这边在匹配中多添加了一个参数cur来描述目前的余数,因为刚好是除以10的余数,所以cur可以设置为一个不大于10的参数,这并不影响累加后对余数造成的结果。
在整个过程中,分为了两步:
第一:创建一个bool函数,用bool函数返回的值来判断是否可以匹配。
第二:创建一个输出函数,这里将集中特殊的情况包含进去了,然后结合前面bool函数的输出结果,输出'YES'或者'NO'。

#include <bits/stdc++.h>
using namespace std;
//创建两个字符串,表达式为m,数字串为s
string m,s;
//进行匹配,i和j分别表示m字符串的位置和s字符串的位置,cur表示前面数的和除以10的余数
bool dfs(int i, int j, int cur)
{
    if (j == s.size()&&i == m.size())
        return true;
    if (i == m.size())
        return false;
    //如果该位置匹配成功,继续匹配下面的位置
    if (m[i] == s[j])
    {
        return dfs(i + 1, j + 1, (cur + s[j] - '0') % 10);
    }
    //如果此位置的字符为'*'时
    else if (m[i] == '*')
    {
        return cur == s[j] - '0' ? dfs(i, j + 1, cur % 10) || dfs(i + 1, j + 1, cur % 10) : false;
    }
    return false;
}
//创建一个函数,对结果进行输出
void getNum() {
    if (s.size() < m.size()) {
        cout << "NO" << endl;
        return;
    }
    for (int i = 0; i < s.size(); i++) {
        if (!(s[i] >= '0'&&s[i] <= '9')) {
            cout << "NO" << endl;
            return;
        }
    }
    int i = 0;
    for (; i < m.size(); ++i) {
        if (m[i] != '*')break;
    }
    s = s.substr(i);
    m = m.substr(i);
    if ((s == ""&&m != "") || (s != ""&&m == "")) {
        cout << "NO" << endl;
        return;
    }
    if (dfs(0, 0, 0)) {
        cout << "YES" << endl;
    }
    else {
        cout << "NO" << endl;
    }
}
int main() {
    string str;
    //首先获取输入的个数
    getline(cin, str);
    int n = stoi(str);
    while (n--) {
        getline(cin,m);
        getline(cin,s);
        getNum();
    }
}