LeetCode刷题笔记 10 / 剑指Offer刷题笔记 19(涉及到递归)

题目:给定一个字符串 (s) 和一个字符模式 ( p )。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符。‘ * ’匹配零个或多个前面的元素。
匹配应该覆盖整个字符串 (s) ,而不是部分字符串。
(s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。)

我的答案:
利用java现有正则方法可直接求出

import java.util.regex.*;
class Solution {
    public static Pattern pattern;
    public static Matcher matcher;
    public boolean isMatch(String s, String p) {
        pattern = Pattern.compile(p);
        matcher = pattern.matcher(s);
        boolean Match = matcher.matches();
        return Match;
    }
}

答案:
每次从字符串里拿出一个字符与pattern中的字符去匹配。如果模式中的字符与字符串中的字符相等或模式中的字符为’.’,则它们相互匹配。
当模式中的第二个字符是’*‘时,问题要复杂一些。
(1)因为’ * '可以匹配字符串中的0个字符,所以可以直接在pattern上向后移动两个字符,相当于直接忽略模式串中这一部分
(2)pattern中的第一个字符和字符串中的第一个字符相匹配,则在字符串上向后移动一个字符。
eg: str = “abc”,pattern = “a * bc” ,第一个字符匹配时,可以直接检验"bc"与pattern是否匹配(因为根据第一种情况,会忽略pattern中的前两个字符)

class Solution {
    public boolean isMatch(String text, String pattern) {
        if (pattern.isEmpty()) return text.isEmpty();
        //第一个字符是否匹配
        boolean first_match = (!text.isEmpty() &&
                               (pattern.charAt(0) == text.charAt(0) || pattern.charAt(0) == '.'));
		//第二个字符为‘*’时,直接忽略前两个字符 或者 当第一个字符匹配时字符串向后移动一个字符
        if (pattern.length() >= 2 && pattern.charAt(1) == '*'){
            return (isMatch(text, pattern.substring(2)) ||
                    (first_match && isMatch(text.substring(1), pattern)));
        } else {
        //否则判断第一个字符以及剩下的字符是否匹配
            return first_match && isMatch(text.substring(1), pattern.substring(1));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值