地址 https://algospot.com/judge/problem/read/WILDCARD
解答
? 比较好解决 比对两者字符串 字母一致则进到下一位 如果一个是?另一个无条件进到下一位
* 则比较麻烦 需要遍历的进行检验
如果w = *abc p1 = abc p2 = fabc p3 = fzgxsfabc;
所以我们需要略过 w[i+1] 分别于 p[j+0] p[j+1] p[j+2]......分别进行检验是否能够匹配
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; /* 2 he?p 3 help heap helpp *p* 3 help papa hello =========================== heap help help papa */ int n, m; vector<string> matchStringV; string targetStr; bool match(const string& s, const string& w) { int pos = 0; while (pos < s.size() && pos < w.size() && (w[pos] == '?' || w[pos] == s[pos])) pos++; if (pos == w.size()) return pos == s.size(); if (w[pos] == '*') { for (int skip = 0; pos + skip <= s.size(); ++skip) if (match(s.substr(pos + skip),w.substr(pos + 1))) return true; } return false; } void solve() { vector<string> ans; for (auto& e : matchStringV) { if (match(e, targetStr)) { ans.push_back(e); } } sort(ans.begin(), ans.end()); for (auto& e : ans) { cout << e << endl; } } int main() { cin >> n; while (n--) { matchStringV.clear(); cin >> targetStr; cin >> m; for (int i =0; i < m; i++) { string s; cin >> s; matchStringV.push_back(s); } solve(); } }
动态规划如下

#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; /* 2 he?p 3 help heap helpp *p* 3 help papa hello =========================== heap help help papa */ int n, m; vector<string> matchStringV; string targetStr; bool match(const string& s, const string& p) { int dp[200][200] = { 0 }; dp[0][0] = 1; for (int i = 0; i < p.size(); i++) { if (p[i] == '*') dp[i + 1][0] = dp[i][0]; for (int j = 0; j < s.size(); j++) { if (p[i] == '*') { dp[i + 1][j + 1] |= dp[i + 1][j] || dp[i][j + 1]; } else if (p[i] == '?') { dp[i + 1][j + 1] |= dp[i][j]; } else if (p[i] == s[j]) { dp[i + 1][j + 1] |= dp[i][j]; } } } return dp[p.size()][s.size()]; } void solve() { vector<string> ans; for (auto& e : matchStringV) { if (match(e, targetStr)) { ans.push_back(e); } } sort(ans.begin(), ans.end()); for (auto& e : ans) { cout << e << endl; } } int main() { cin >> n; while (n--) { matchStringV.clear(); cin >> targetStr; cin >> m; for (int i = 0; i < m; i++) { string s; cin >> s; matchStringV.push_back(s); } solve(); } }