题解 | #字符串通配符#

字符串通配符

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总是写错。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务