10.Regular Expression Matching

来源:互联网 发布:宁波行知实验小学校歌 编辑:程序博客网 时间:2024/04/26 06:37

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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "a*") → trueisMatch("aa", ".*") → trueisMatch("ab", ".*") → trueisMatch("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;                }                            }        }    }}


0 0
原创粉丝点击