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

浙公网安备 33010602011771号