包含“?”和“*”的通配符字符串匹配

来源:互联网 发布:脸书注册总说网络错误 编辑:程序博客网 时间:2024/05/03 20:00
题目描述:
Str1中可能包含的字符:除了'*'和'?'以外的任意字符。
Str2中可能包含的字符:任意字符。其中,'?'表示匹配任意一个字符,'*'表示匹配任意字符0或者多次。

给出这样两个字符串,判断Str2是否是Str1的子串,如果是输出第一个匹配到的子串的初始位置,如果不是,输出"-1"。

代码如下:

</pre><pre name="code" class="cpp">#include<iostream>using namespace std;#include<string>using std::string;#include<vector>int main(){string a,b;cin>>a;cin>>b;vector<string> t;string tmp="";int front = 0;int last = 0;int substart = 0;if(a[0]=='*'){ front = 1;}if(a[a.size()-1]=='*'){last = 1;}for(int i=0;i<a.size();i++){ if(i==0&&a[i]=='*'){substart = i+1;continue;}if(a[i]=='*'&&i-substart>0){t.push_back(a.substr(substart,i-substart));substart = i+1;}else if(i==a.size()-1&&i-substart+1>0){t.push_back(a.substr(substart,i-substart+1));}}if(t.size()==0&&b.size()>0) {cout<<0<<endl;return 0;}for(int i =0;i<t.size();i++){ cout<<t[i]<<endl;;}int f =0;int c =0;int s = -1;int sucess = 0;int front1 = 0;for(int i = 0;i<b.size()+1;i++){  if(front==1){   front = 0;    s = 0;front1 = 1;continue;}if(c>=t[f].size()){f++;c= 0;if(f>=t.size()){  if(last==0||(last==1)){sucess = 1;break;}}continue;}if(i>=b.size())break;if(t[f][c]=='?'){   if(f==0&&c==0&&front1==0){s=i;}c++;}else{if(t[f][c]==b[i]){  if(f==0&&c==0&&front1==0){s=i;} c++;}else{i = i-c;c = 0;}}//cout<<f<<" "<<c<<endl;}if(sucess==0) s = -1;cout<<s;system("pause");return 0;}



0 0