题解 | #字符串通配符#
字符串通配符
http://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
使用动态规划
1.dp[0][0]=1,空串和空串匹配
1.串首的*可以和空串匹配,串首为*,dp[i][0]=1;
2.*时(*可以匹配0个或无限个合法字符),即为左边和上边的最大值,左边:用*继续做匹配;上边:忽略*
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
3.?时(只能匹配一个合法字符,且不能忽略?)
dp[i][j]=dp[i-1][j-1];4.字符相等时
dp[i][j]=dp[i-1][j-1];5.其他不满足上述条件的,dp[i][j]=0;
总代码:
/*HJ71 字符串通配符 动态规划 dp[i][j] pattern前i个,string前j个 */ #include <iostream> using namespace std; int main() { string pattern; string str; int dp[100][100]={0}; cin>>pattern; cin>>str; dp[0][0]=1; for(int i=0;i<pattern.length();i++)//全部转换为小写字母 { if(pattern[i]>='A'&&pattern[i]<='Z') pattern[i]=pattern[i]-'A'+'a'; } for(int i=0;i<str.length();i++) { if(str[i]>='A'&&str[i]<='Z') str[i]=str[i]-'A'+'a'; } for(int i=1;pattern[i-1]=='*';i++) //串首的*可以跟空串匹配 { dp[i][0]=1; } for(int i=1;i<=pattern.length();i++)//dp数组更新 for(int j=1;j<=str.length();j++) { if(pattern[i-1]=='*') dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//dp[i-1][j]:忽略*,dp[i][j-1]:用*做匹配该字符 (注意*可以匹配0个或者多个字符) else if(pattern[i-1]=='?'&&(str[j-1]>='0'&&str[j-1]<='9'||str[j-1]>='a'&&str[j-1]<='z')) dp[i][j]=dp[i-1][j-1]; else if(pattern[i-1]==str[j-1]) dp[i][j]=dp[i-1][j-1]; } // for(int i=1;i<=pattern.length();i++)//dp数组打印 // { // cout<<pattern[i-1]; // for(int j=1;j<=str.length();j++) // { // cout<<dp[i][j]<<" "; // } // cout<<endl; // } if(dp[pattern.length()][str.length()]) cout<<"true"<<endl; else cout<<"false"<<endl; }