题解 | #字符串通配符#
字符串通配符
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总是写错。