10.Regular Expression Matching

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
说明:*号之前的字符可以出现多次,比如说a*b可以和ab也可以和aab匹配,甚至也可以和b匹配,因为a可以出现0次。
public class Solution {
    public boolean isMatch(String s, String p) {
        return toMatch(s,p,0,0);
    }
    //detemine whether substring(i,s,length()) and substring(j,p.length()) are matching or not under the condition of s(0,i) and
    //p(0,j) are alreadly matching.
    public boolean toMatch(String s,String p,int i,int j){
        //if j is beyond the last one, only i is beyond last one ,then return true.
        if(j>=p.length()){
            return i>=s.length();
        }
        //if j is the last one
        else if(j == p.length()-1){
            //only i is the last one and {s(i)==p(j) or p(j)=='.'}, then return true; 
            if(i==s.length()-1&&(s.charAt(i)==p.charAt(j)||p.charAt(j)=='.')){
                return true;
            }
            else{
                return false;
            }
        }
        else{
            //case1:p(j+1) is not '*'
            if(p.charAt(j+1)!='*'){
                //if no more i to match, retrun false.
                if(i>=s.length()){
                    return false;
                }
                else{
                    //if s(i)==p(j) or p(j) =='.', it means s(i) and p(j) are matching, to judge the rest s(i+1...) and p(j+1...).
                    if(p.charAt(j)==s.charAt(i)||p.charAt(j)=='.'){
                        return toMatch(s,p,i+1,j+1);
                    }
                    //s(i) and p(j) are nor matching ,directly return false.
                    else{
                        return false;
                    }
                }
            }
            else{
                //case2:specially, p(j+1) == '*'.
                //case2.1:if s(i...) and p(j+2...) and matching, a char & '*' can stand for 0 element
                if(toMatch(s,p,i,j+2)){
                    return true;
                }
                else{
                   int k = i;
                   //case 2.2: a char & '*' can stand for 1 or more preceding element, 
	            	//so try every sub string
                    while(k<s.length()&&(k < 0 || s.charAt(k)== p.charAt(j)||p.charAt(j)=='.')){
                        if(toMatch(s,p,k+1,j+2)){
                            return true;
                        }
                        k++;
                    }
                    return false;
                }
                
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值