字符串通配符匹配问题
问题: S代表原字符串,P代表模式串,包含* (匹配0或者多个)和?(匹配一个)
思路:动态规划
- dp[i][j] 代表 S的前i个字符和P的前j个字符是否匹配, 最后返回dp[s.length()][p.length()]
- p[j-1]==* 则 dp[i][j] = dp[i-1][j] || dp[i-1][j-1] || dp[i][j-1] 分别代表 * 匹配0个,一个,多个字符
- p[j-1]!=* 如果s[i-1] == p[j-1]或者p[j-1]==? 当前字符匹配,则 dp[i][j]=dp[i-1][j-1] ,否则默认为false
- dp[0][0] = true;
- dp[0][j] 需要处理 模式串以 ”**。。。“开头的情况, 即任意全部字符为 * 的模式串可以匹配 0 个长度的字符
- dp[i][0] 模式串开头为 * 时,dp[i][0]代表任意长度字符串可以与 * 匹配
class Solution {
public boolean isMatch(String s, String p) {
if(null==s || null==p) return false;
if("*".equals(p) || s.equals(p)) return true;
int sl = s.length(), pl=p.length();
if(pl==0) return false; //模式串为空,匹配串不为空
boolean[][] dp = new boolean[sl+1][pl+1];
char[] sc = s.toCharArray();
char[] pc = p.toCharArray();
dp[0][0] =true;
if(pc[0]=='*') {
int j=0;
while(j<pl && pc[j++]=='*') dp[0][j]=true; //处理模式串“***。。”的情况
for(int i=1;i<=sl;i++) dp[i][0]=true;
}
for(int i =1;i<=sl;i++){
for(int j=1;j<=pl;j++){
if(pc[j-1]=='*') dp[i][j] = dp[i-1][j] || dp[i][j-1] || dp[i-1][j-1];
else if(pc[j-1]==sc[i-1] || pc[j-1]=='?') dp[i][j] = dp[i-1][j-1];
}
}
return dp[sl][pl];
}
}

浙公网安备 33010602011771号