通配符
package com.wb.magic.rest.leetcode;
/**
* leetcode 通配符
*/
public class Wildcard {
public static void main(String[] args) {
}
public boolean isMathch(String s,String p){
//字符串转数组
char[] cs = s.toCharArray();
char[] cp = p.toCharArray();
// dp[i][j]表示s的前i个字符和p的前j个字符匹配
boolean[][] dp = new boolean[cs.length+1][cp.length+1];
//从右边往左边匹配,看最后一个字符
//s 为空,p为空 能够匹配
dp[0][0]=true;
//s为空,p不为空,所以从1开始
for(int j=1;j<=cp.length;j++){
if(cp[j-1]=='*'){
//转换为子问题,j-1消除前一个元素(0,j-3)就是前j-2元素
dp[0][j]=dp[0][j-2];
}
}
//对于s不为空,p空 当然是false,走默认值
//填格子(从下标1 开始)
for(int i=1;i<=cs.length;i++){
for (int j = 1; j <=cp.length; j++) {
//最后一个字符能够匹配上就转换为子为题s(0,i-2) p(0,j-2)
if(cs[i-1]==cp[j-1]||cp[j-1]=='.'){
dp[i][j]=dp[i-1][j-1];
}else {
//最后字符不能匹配上,因为*可以使其匹配
if(cp[j-1]=='*'){
//cs的最后字符和cp的倒数第二个字符匹配上
if(cs[i-1]==cp[j-2]||cp[j-2]=='.'){
//*去除左边一个元素s(0,i-1) p(0,j-3)/*作为空字符s(0,i-2) p(0,j-3)/*作为复制左边多个元素,*复制一个匹配一个
dp[i][j]=dp[i][j-2]||dp[i-1][j-2]||dp[i-1][j];
}else {
//cs的最后字符和cp的倒数第三个字符匹配上,使用*去掉前一个字符
dp[i][j]=dp[i][j-2];
}
}
}
}
}
//求出dp[i][j]
return dp[cs.length][cp.length];
}
}