本题源自leetcode
-----------------------------------------------------------
https://leetcode.com/problems/wildcard-matching/description/
思路:
1 用两个变量循环遍历字符串。两个变量标识 匹配到特殊字符* 的时候子串和母串的下标变量变化。
2 最后判断是否匹配。
代码:
bool isMatch(string s, string p) {
int m=s.length();
int n=p.length();
int i=0;
int j=0;
int sp=-1;
int pp=-1;
while(i<m){
if(s[i]==p[j]||p[j]=='?'){
i++;
j++;
}else if(p[j]=='*'){
pp=++j;
sp=i;
}else{
if(pp>-1){
j=pp;
i=++sp;
}else{
return false;
}
}
}
while(p[j]=='*')
j++;
return j==n;
}
代码2:
bool isMatch(string s, string p) {
if(s.length()==0&&p.length()==0)
return true;
int m=s.length();
int n=p.length();
vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));
dp[0][0]=true;
for(int i=1;i<=n;i++){
// 第一行,匹配字符为空,所以考虑待匹配字符为*的情况
if(p[i-1]=='*'){
dp[0][i]=dp[0][i-1];
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(s[i-1]==p[j-1]||p[j-1]=='?'){
dp[i][j]=dp[i-1][j-1];
}
if(p[j-1]=='*'){
dp[i][j]=dp[i][j-1]||dp[i-1][j];
}
}
}
return dp[m][n];
}