题解 | #字符串通配符#
字符串通配符
https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
#include <cctype>
#include <iostream>
#include <ostream>
#include <vector>
using namespace std;
int main() {
string p;
string s;
cin >> p >> s;
for(char& i : s)
i = tolower(i);
for(char& i : p)
i = tolower(i);
int n = p.length();
int m = s.length();
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= m; j++) {
if(!i && !j) {
dp[i][j] = 1;
continue;
}
if(!i) {
continue;
}
if(!j) {
if(p[i - 1] != '*') continue;
dp[i][j] |= dp[i - 1][j];
continue;
}
if(p[i - 1] == s[j - 1]) {
dp[i][j] |= dp[i - 1][j - 1];
}
if(p[i - 1] == '*') {
dp[i][j] |= dp[i - 1][j];
int t = j;
while(isdigit(s[t - 1]) || (s[t - 1] <= 'z' && s[t - 1] >= 'a')) {
dp[i][t] |= dp[i][t - 1];
t++;
}
}
if(p[i - 1] == '?' && (isdigit(s[j - 1]) || islower(s[j - 1]))) {
dp[i][j] |= dp[i - 1][j - 1];
continue;
}
}
}
// for(int i = 0; i <= n; i++) {
// for(int j = 0; j <= m; j++) {
// cout << dp[i][j] << " ";
// }
// cout << endl;
// }
cout << (dp[n][m] ? "true" : "false") << endl;
return 0;
}
一个DP就解决了,今日状态不佳,一直在调bug。晕乎乎的ij总是写错。


腾讯成长空间 6071人发布