1. 程式人生 > >String、動態規劃——正則表示式匹配

String、動態規劃——正則表示式匹配

public class Solution {
    public boolean isMatch(String s, String p) {
        if(s == null||p == null)
            return false;
        boolean [][]flag=new boolean[100][100];
        //flag[i][j]表示s.length == i and p.length == j 時匹配情況
        //使用自底向上的方法
        flag[0][0]=true;
       
        int m=s.length()+1;
        int n=p.length()+1;
        //s.length!=0,p.length == 0時,全部為false;  
        for(int i=1;i<m;i++)
            {
            flag[i][0]=false;
        }
        //p.length!=0,s.length == 0時的情況。
        for(int j=1;j<n;j++)
            {
            if(j>=2&&p.charAt(j-1) == '*')//去掉p.charAt(0) == '*'的情況;
                {
                flag[0][j]=flag[0][j-2];
            }else
                {
                flag[0][j]=false;
            }
        }
        
        for(int i=1;i<m;i++)
            {
            for(int j=1;j<n;j++)
                {
                if(j>=2&&p.charAt(j-1) == '*')//去掉p.charAt(0) == '*'的情況;
                    {
                    if(p.charAt(j-2) == s.charAt(i-1)||p.charAt(j-2) == '.')
                        {
                    flag[i][j]=flag[i][j-2]||flag[i-1][j]||flag[i-1][j-2];          
                    }
                    else
                        {
                        flag[i][j]=flag[i][j-2];
                    }   
                }
                
                else if(p.charAt(j-1) == s.charAt(i-1)||p.charAt(j-1) == '.')
                    {
                    flag[i][j]=flag[i-1][j-1];
                }
                else
                    {
                    flag[i][j]=false;
                }
            }
        }
        return flag[m-1][n-1];
    }
}