LeetCode 第10题:正则表达式匹配

2020-11-25  本文已影响0人  放开那个BUG

1、前言

题目描述

2、思路

凡是关于字符串的题,都应该想到指针,那么就应该想到递归(动态规划的转移方程不一定能第一时间想出来,所以能写递归先写递归)。

这道题准备两个指针 i、j,分别为字符串 s、p 的索引,索引从0开始。我们需要对 “.” 和 “” 进行特殊处理。针对 “.”,我们任意的字符都可以匹配;针对 “”,我们可以匹配0个或多个相同的字符。

首先,我们从起始位置开始,先针对性的匹配第一个字符,或者“.”。然后在针对性的匹配字符 “”,匹配字符 “”时要注意首先该字符第二个字符为 “*” 才能进入条件,然后针对这种行为可以忽略此字符,从 j + 2 开始;或者刚才的匹配 && i + 1 跟 j 匹配。

如果不能进入此条件,那么就是刚才的匹配 && 两个索引都往下一个。

3、代码

public class Q10_IsMatch {

    public boolean isMatch(String s, String p) {
        if(s == null || p == null){
            return false;
        }

        return dp(s, 0, p, 0);
    }

    private boolean dp(String s, int i, String p, int j){
        if(j == p.length()){
            return i == s.length();
        }

        boolean firstMath = i < s.length() && j < p.length() && (p.charAt(j) == s.charAt(i) || p.charAt(j) == '.');
        boolean ans = false;
        if(j <= p.length() - 2 && p.charAt(j + 1) == '*'){
            ans =  dp(s, i, p, j + 2) || (firstMath && dp(s, i + 1, p, j));
        }else{
            ans =  firstMath && dp(s, i + 1, p, j + 1);
        }

        return ans;
    }


    public static void main(String[] args) {
        String s = "a", p = "aa";

        System.out.println(new Q10_IsMatch().isMatch(s, p));
    }
}
上一篇下一篇

猜你喜欢

热点阅读