看了题解的动态规划,感觉*那一块不是很理解,*明明可以匹配多个字符,因此只从前一个字符来转移不太妥当,*那一块匹配写了备注,希望有人看懂
#include <cctype> #include <iostream> using namespace std; const int maxn = 1e3; int match[maxn][maxn]; int main() { string str1, str2; cin >> str1 >> str2; int len1 = str1.size(); int len2 = str2.size(); str1 = " " + str1; str2 = " " + str2; match[0][0] = 1; // * 可以匹配0个字符 for(int i = 1; i <= len1; i++){ if(str1[i] == '*') match[i][0] = match[i-1][0]; } for(int i = 1; i <= len1; i++){ for(int j = 1; j <= len2; j++){ if(toupper(str1[i]) == toupper(str2[j]) || (str1[i] == '?' && isalnum(str2[j]))){ match[i][j] = match[i-1][j-1]; } else if(str1[i] == '*'){ match[i][j] = match[i-1][j]; // *匹配空字符 for(int k = j; k >= 1; k--){ //*匹配多个字符 if(isalnum(str2[k])) match[i][j] = match[i-1][k-1] || match[i][j]; //如果是字母和数字,说明这后面的一排都可以用*匹配 else break; // 一旦出现不是字母和数字的情况,那么此时不能用*匹配 } } } } if(match[len1][len2]) cout << "true"; else cout << "false"; } // 64 位输出请用 printf("%lld")