题解 | #字符串通配符#
https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
#include <iostream>
#include <string>
using namespace std;
bool match(const string& pat,const string& tag,int pidx,int tidx){
// 同时到达末尾!
if(pidx >= pat.size() && tidx >= tag.size()) return true;
// 只有一个到达末尾!
if(pidx >= pat.size() || tidx >= tag.size()) return false;
// 模式串是 ? 单字符通配符!
if(pat[pidx] == '?'){
// 如果对应到的位置不能被替代!
if(!isdigit(tag[tidx]) && !isalpha(tag[tidx])) return false;
// 能被替代,向下继续走!
return match(pat,tag,pidx + 1,tidx + 1);
}else if(pat[pidx] == '*'){ // 遇到的是一个 * 无穷通配符!
while(pat[pidx] == '*') pidx ++; // 连续的 * 只能算是一个 *
pidx --; // 只认为连续的*中最后一个*有效!
if(!isdigit(tag[tidx]) && !isalpha(tag[tidx])) return match(pat,tag,pidx + 1,tidx); // 当* 无法匹配 * 做空字符!
return match(pat,tag,pidx + 1,tidx) || match(pat,tag,pidx + 1,tidx + 1) || match(pat,tag,pidx,tidx + 1); // * 可以不用于匹配, 可以用于匹配单个字符,可以匹配多个字符!
}else if(tolower(pat[pidx]) == tolower(tag[tidx])){ // 当对应位置字符相同,就直接一起向下即可!
return match(pat,tag,pidx + 1,tidx + 1);
}
return false;
}
int main(){
string pat,tag;
getline(cin,pat);
getline(cin,tag);
if(match(pat,tag,0,0)) cout<<"true";
else cout<<"false";
cout<<endl;
return 0;
}
安克创新 Anker公司福利 739人发布