LintCode第192题-通配符匹配
描述
给定一个字符串 s
和一个字符模式 p
,实现一个支持 '?'
和 '*'
的通配符匹配。匹配规则如下:
'?'
可以匹配任何单个字符。'*'
可以匹配任意字符串(包括空字符串)。
两个串完全匹配才算匹配成功。
样例
样例1
输入:
"aa"
"a"
输出: false
输出2
输入:
"aa"
"aa"
输出: true
输出3
输入:
"aaa"
"aa"
输出: false
输出4
输入:
"aa"
"*"
输出: true
说明: '*' 可以替换任何字符串
输出5
输入:
"aa"
"a*"
输出: true
样例6
输入:
"ab"
"?*"
输出: true
说明: '?' -> 'a' '*' -> 'b'
样例7
输入:
"aab"
"c*a*b"
输出: false
思路:
难点在于该题的初始化 转移方程
初始化:
dp[0][j]=dp[0][j-1];
转移方程:
匹配分为3部分 普通字符匹配 ?匹配 *匹配
//如果是普通匹配 那么就是
dp[i][j]=dp[i-1][j-1];
//如果是p的字符是?情况的匹配
dp[i][j]=dp[i-1][j-1];
//如果是p的字符是*的情况下的匹配
dp[i][j]=dp[i][j-1] || dp[i-1] [j];
dp[i][j]=dp[i][j-1]用于s是空字符串 p是*的情况
dp[i][j]=dp[i-1] [j];//这个就是当p[j]为字符*的时候 *
可以不匹配任何字符,只是“存在但不参与匹配” 所以选择忽略掉
代码如下:
public class Solution {
public boolean isMatch(String s, String p) {
int m = s.length();
int n = p.length();
boolean[][] dp=new boolean[m+1][n+1];
dp[0][0]=true;//空串匹配空串
//初始化
for(int j=1;j<=n;j++)
{
if(p.charAt(j-1)=='*')
{
dp[0][j]=dp[0][j-1]; 继承上一个状态
}else {
break; // 一旦不是 *,后面都不可能匹配空串了
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
char scharacter=s.charAt(i-1);
char pcharacter=p.charAt(j-1);
if(scharacter==pcharacter|| pcharacter == '?')
{
dp[i][j]=dp[i-1][j-1];
}else if(pcharacter=='*')
{
dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
}else
{
dp[i][j]=false;
}
}
}
return dp[m][n];
}
}