Leetcode #10 Regular Expression Matching 正则表达式匹配 解题小节

1 原题

原题

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

2 题目理解

给定一个正则表达式,和一个字符串,判断其是否匹配
规则很简单:
1、”.“ 匹配任意单个字符
2、一个其余字符如果跟着*,那么可以匹配0~n个,如果没有跟着的话就只能匹配自身

解题方式:
递归求解
遇到.和没有*的直接匹配
遇到*,每次都分跳过和匹配两种

详细的看我代码备注

3 AC解

/**
 * 
 * 这个解法是递归,记住规则,两个指针分别指向两个串:
 *   1、首先检测是否有*存在,有*存在要分开两种状况,1是有*
 *          a、*前面的字符匹配了(.或完全相等),那么分别递归两种情况,第一个就是匹配了当前字符,正则还停留在*这里,第二个则是b
 *          b、跳过*,不匹配,或者说空匹配
 *   2、如果没有*
 *          a、如果当前位置匹配了,那么继续向后匹配
 *          b、直接gameover
 *   3、如果两个串都到了终点,证明匹配完全,返回true
 *   4、如果有一方已经到达了终点,证明没匹配完全,此时:
 *          a、如果pattern正则式那边后面还有若干*的字符,那么先跳过这些*的匹配,因为可以空匹配
 *          b、当全部跳过后,如果p还没到终点,那么就证明无法匹配,反之二者匹配
 * */

public class Solution {
    char[] subject;
    char[] pattern;
    int slen,plen;
    public boolean check(int si,int pi){
        if(si==slen && pi==plen) // 匹配3
            return true;
        if(si<slen && pi<plen){
            if(pi<plen-1 && pattern[pi+1]=='*'){
                boolean same=false;
                if(pattern[pi]=='.' || pattern[pi]==subject[si])
                    same=true;
                boolean flag=false;
                if(same)
                    flag=check(si+1,pi); // 匹配1.a
                if(flag==false)
                    flag=check(si,pi+2); //  匹配1.b
                return flag;
            } else{
                if(pattern[pi]=='.' || pattern[pi]==subject[si])
                    return check(si+1,pi+1);//匹配2.a
                return false; //匹配2.b
            }
        } 
        else{
            while (pi<plen-1 && pattern[pi+1]=='*'){ //处理4的状况
                pi+=2;
            }
            if(si==slen && pi==plen) //匹配4.a处理 4.2b后pattern达到终点
                return true;
            return false;//匹配4.a处理 4.2b后pattern也没有达到终点
        }

    }
    public boolean isMatch(String s, String p) {
        slen=s.length();
        plen=p.length();
        subject=s.toCharArray();
        pattern=p.toCharArray();
        return check(0,0);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值