题解 CF1023A 【Single Wildcard Pattern Matching】

Chinshyo

2020-11-30 23:25:00

Solution

# 我的思路 我的思路就是将整个输入的 $s1$ 字符串与 $s2$ 进行比对。在此过程中,我们分别从开头到结尾各做一次循环,记录下是从什么时候开始不一样的。我们拿样例举例: ![](https://cdn.luogu.com.cn/upload/image_hosting/e7is09ab.png) 图中的红色框就是我们即将用来代替“ $*$ ”的。所以**只要将红色框内的东西判断一下大小写**就好了。 # 吹毛求疵 这道题有一个坑。首先样例中有过找不到“ $*$ ”号的情况,如果有这种情况我们这种算法是会出问题的。所以我们加一句话来判断这个是否合格: ```cpp if(s1.find('*') == s1.npos){ //如果找不到*号 cout << "NO" << endl; return 0; //直接再见 } ``` # 贴代码 ``` #include<bits/stdc++.h> using namespace std; int main(){ int n1, n2;//无脑输入 cin >> n1 >> n2; string s1, s2; cin >> s1 >> s2; if(s1.find('*') == s1.npos){ cout << "NO" << endl; return 0; } int fr;//寻找起点终点 for(int i = 0; i < s1.size(); i++){ if(s1[i] != s2[i]){ fr = i; break; } } int bc; for(int i = s1.size()-1; i <=0; i--){ if(s1[i] != s2[i]){ bc = i; break; } } for(int i = fr; i <= bc; i++){ if(!islower(s2[i])){ //判断是否小写 cout << "NO" << endl; return 0; //有不是小写的先再见 } } cout << "YES" << endl; return 0; } ```