题解 | 字符串通配符
#include <cctype>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
int main() {
string s, p;
cin >> s >> p;
vector <vector<int>>dp(s.size() + 1, vector<int>(p.size() + 1, 0));
dp[0][0] = 1;
char ch1;
for (int i = 1; i <= s.size(); i++) {
ch1 = s[i - 1];
dp[i][0] = dp[i - 1][0] && ch1 == '*';
}
for (int i = 1; i <= s.size(); i++) {
ch1 = s[i - 1];
for (int j = 1; j <= p.size(); j++) {
char ch2 = p[j-1];
if (ch1 == '*') {
if (isalnum(ch2)) {//只有在第二个字符是数字或者字母时才生效
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
continue;
} else {
dp[i][j] = dp[i - 1][j];
continue;
}
}
if (isalpha(ch2)) {
if (ch1 == '?' || toupper(ch1) == toupper(ch2)) {
dp[i][j] = dp[i - 1][j - 1];
continue;
}
} else if (isdigit(ch2)) {
if (ch1 == '?' || ch1 == ch2) {
dp[i][j] = dp[i - 1][j - 1];
continue;
}
}
else if(ch1==ch2){
dp[i][j] = dp[i - 1][j - 1];
continue;
}
}
}
if(dp[s.size()][p.size()]==1)cout<<"true";
else cout<<"false";
}
一开始完全没想到用动态规划去求解,后面参考了2021年一个牛友发的题解https://blog.nowcoder.net/n/ed2ff73aee41422c8bfc7089ead67567?f=comment,不过他的代码也不严谨。'*'只能匹配数字或字母,不能匹配其他字符。我修改了一下。
#转行#
腾讯成长空间 5950人发布
查看2道真题和解析
