题解
题目难度:中等
知识点:查找、递归
解题思路:整道题其实不难,在题目的描述过程中需要读懂题意。其实就是一道字符匹配的题,整个过程只要依次对字符串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(); } }