[leedcode 10] Regular Expression Matching

Implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true

public class Solution {
    public boolean isMatch(String s, String p) {
        //递归实现 注意终止条件:p的长度判断p==0;p==1;p>=2;三种
       //当p大于1时,判断p[1]和'*'的关系,若!='*',正常比较s和p.    substring(1)
       //若p[j+1]=='*',如果是p[j]==s[j],需要比较s[j]=p[j+2] or s[j+1]=p[j+2] or s[j+2]=p[j+2]...  ;若p[j]!=s[j],s[j]=p[j+2]
       
       if(p.length()==0)
            return s.length()==0?true:false;//判断是否都为空,很有技巧
       if(p.length()==1){
           return s.length()==1&&(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.');
       }
       if(p.charAt(1)!='*'){
           if(s.length()==0)return false;
           if(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.')
                return isMatch(s.substring(1),p.substring(1));
            else return false;
           
       }else{
           while(s.length()>0&&(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.')){
               if(isMatch(s,p.substring(2)))
                    return true;
               s=s.substring(1);
           }
           return isMatch(s,p.substring(2));
           
           
       }
       
       
    }
}
原文地址:https://www.cnblogs.com/qiaomu/p/4625337.html