题解 | #记票统计#

字符串通配符

http://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

动态规划解法。
#include <iostream>
#include <string>
#include <vector>
using namespace std;

bool ismatch(char a, char b){
    if (a >= 'A' && a <= 'Z'){
        a += 32;
    }
    if (b >= 'A' && b <= 'Z'){
        b += 32;
    }
    return a == b;
}
bool isvalid(char a){
    return (a >= 'A' && a <= 'Z') || (a >= 'a' && a <= 'z') || (a >= '0' && a <= '9');
}

int main(){
    string s, t;
    while (cin >> t >> s){
        int len_1 = s.size(), len_2 = t.size();
        vector<vector<int>> dp(len_1 + 1, vector<int>(len_2 + 1, 0));
        dp[0][0] = 1;
        bool flag = false;
        for (int i = 0; i <= len_1; i++){
            for (int j = 1; j <= len_2; j++){
                if (t[j - 1] != '*'){
                    if (i > 0 && (ismatch(s[i - 1],t[j - 1]) || (t[j - 1] == '?' && isalpha(s[i - 1])))){
                        dp[i][j] = dp[i - 1][j - 1];
                    }
                }else if (t[j - 1] == '*'){
                    dp[i][j] |= dp[i][j - 1];
                    if (j == 1) dp[i][j] = 1;
                    
                    for (int k = 1; k < i; k++){
                        if (j >= 2 && (ismatch(s[k - 1], t[j - 2]) || t[j - 2] == '?')){
                            dp[i][j] |= dp[k][j];
                        }
                    }
                }else{
                    flag = true;
                    break;
                }
                if (flag) break;
                //printf("dp[%d][%d] = %d\n", i, j, dp[i][j]);
            }
        }
        if (flag) {
            cout << "false" << endl;
            continue;
        }
        if (dp[len_1][len_2]) cout << "true" << endl;
        else cout << "false" << endl;
    }
    
    
    return 0;
}


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务