**********************************递归*************************************
public class Solution {
    public boolean match(char[] str, char[] pattern){  
        return judge(str,0,pattern,0);
    }
    public boolean judge(char[] str,int i, char[] pattern,int j){
        int m=str.length;
        int n=pattern.length;
        if(i==m&&j==n)return true;
        if(i<m&&j==n) return false;
        if(i==m&&j<n){
            if(j+1<n&&pattern[j+1]=='*'){
                return judge(str,i,pattern,j+2);
            }else return false;
        }
        char a=str[i],b=pattern[j],c='a';
        if(j+1<n){
           c=pattern[j+1];
        }
        if(c!='*'){
            if(a==b||b=='.'){
                return judge(str,i+1,pattern,j+1);
            }
            else return false;
        }
        else if(a==b||b=='.'){
            return judge(str,i,pattern,j+2)||judge(str,i+1,pattern,j);
        }return judge(str,i,pattern,j+2);
    }
}
   ****************************动态规划**************************************
public class Solution {
    public boolean match(char[] str, char[] pattern)
    {
        int m=str.length;
        int n=pattern.length;
        if(m!=0&&n==0)return false;//
        boolean[][]dp=new boolean[m+1][n+1];
        dp[0][0]=true;//
        for(int j=1;j<=n;j++){
            if(pattern[j-1]=='*'&&dp[0][j-2]){
                dp[0][j]=true;
            }
        }
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                char a=str[i-1],b=pattern[j-1];
                if(a==b||b=='.'){
                    dp[i][j]=dp[i-1][j-1];
                }
                else if(b=='*'){
                    if(j>=2){
                        char c=pattern[j-2];
                        if(a==c||c=='.'){
                            dp[i][j]=dp[i][j-1]||dp[i-1][j];
                        }dp[i][j]=dp[i][j]||dp[i][j-2];
                    }
                }else dp[i][j]=false;
            }
        }return dp[m][n];
    }
}