Regular Expression Matching @LeetCode

总的来说思路是递归。

判断下一个字符是否是*:

如果不是*,则判断当前字符是否匹配。

如果是*,则因为不能确定*到底会匹配几个,在当前字符匹配的前提下,要枚举所有的情况,从假设匹配0个,1个,2个。。。只要有一种情况成功了,最终也就成功了。

我们可以从0开始,先考虑直接跳过当前2个正则字符,然后再1个,2个继续搜索下去。

如果是*,但是当前字符不匹配,则跳过两个递归。

具体的代码如下,注释写得很清楚。

ref: http://blog.csdn.net/fightforyourdream/article/details/17717873

package Algorithms;

public class IsMach {
    public static void main(String[] str) {
        //System.out.println(isMatch("aa", "aa"));
        System.out.println(isMatch("aab", "c*a*b"));
    }
    
    public static boolean isMatch(String s, String p) {
        if (s == null || p == null) {
            return false;
        }
        
        return help(s, p, 0, 0);
    }
    
    public static boolean help(String s, String p, int indexS, int indexP) {
        int pLen = p.length();
        int sLen = s.length();
        
        // 1. P结束了,这时 S也应该要结束 
        if (indexP == pLen) {
            return indexS == sLen;  
        }
        
        // 2. P 只有最后一个没有匹配
        if (indexP == pLen - 1) {
            // 必须相等,或者是p为'.'.  
            // S必须只有一个字符
            return indexS == sLen - 1 && matchChar(s, p, indexS, indexP);
        }
        
        // 以下P 至少还有2个字符.
        
        // 2. 单独匹配的情况, 如 aa, a. 类似这样
        if (p.charAt(indexP + 1) != '*') {
           if (indexS < sLen && matchChar(s, p, indexS, indexP)) {
               return help(s, p, indexS + 1, indexP + 1);  // p可以前进一格
           } else {
               return false;
           }
        }
        
        // 3. 多重匹配的情况, 如 .* or a* ,这时需要进行递归
        
        // 先直接跳过此2个正则,因为我们可以匹配空。
        if (help(s, p, indexS, indexP + 2)) {  
            return true;
        }
        
        // 匹配非空的情况,这里不可以跳过p,必须 匹配1个或是多个
        for (int i = indexS; i < sLen; i++) {
            if (!matchChar(s, p, i, indexP)) {
                return false;
            } else {
                if (help(s, p, i + 1, indexP + 2)) {
                    return true;
                }
            }
        }
        
        // 多重匹配之后,余下的字串仍然不可以匹配,则返回失败。
        return false;
    }
    
    // check if the s match p in the index.
    public static boolean matchChar(String s, String p, int indexS, int indexP) {
        return (s.charAt(indexS) == p.charAt(indexP)) || p.charAt(indexP) == '.';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值