LeetCode Java First 400 题解-010

本文深入探讨了正则表达式匹配算法,通过动态规划实现对输入字符串与模式的匹配,支持‘.’和‘*’两种特殊字符。文章详细解析了算法流程,包括如何处理特殊字符,以及如何通过动态规划解决匹配问题。

Regular Expression Matching    Hard

Given an input string (s) and a pattern (p), 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).

Note:

  • s could be empty and contains only lowercase letters a-z.
  • p could be empty and contains only lowercase letters a-z, and characters like . or *.

Example 1:

Input:

s = "aa"

p = "a"

Output: false

Explanation: "a" does not match the entire string "aa".

Example 2:

Input:

s = "aa"

p = "a*"

Output: true

Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

Example 3:

Input:

s = "ab"

p = ".*"

Output: true

Explanation: ".*" means "zero or more (*) of any character (.)".

Example 4:

Input:

s = "aab"

p = "c*a*b"

Output: true

Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".

Example 5:

Input:

s = "mississippi"

p = "mis*is*p*."

Output: false

public boolean isMatch(String str, String regex) {

    int m = str.length(), n = regex.length();

    boolean[][] dp = new boolean[m + 1][n + 1];

    dp[0][0] = true;

    for (int i = 1; i <= n; ++i) {

        if (regex.charAt(i - 1) == '*')

            dp[0][i] = dp[0][i - 2];

    }



    for (int i = 1; i <= m; i++) {

        for (int j = 1; j <= n; j++) {

            if (match(str.charAt(i - 1), regex.charAt(j - 1)))

                dp[i][j] = dp[i - 1][j - 1];

            else if (regex.charAt(j - 1) == '*') {

                dp[i][j] = dp[i][j - 2];// *前字符出现0

                if (match(str.charAt(i - 1), regex.charAt(j - 2)))

                    dp[i][j] |= dp[i - 1][j];//*前字符出现过

            }

        }

    }

    return dp[m][n];

}



private boolean match(char s, char p) {

    return p == '.' || s == p;

}

思路:动态规划。如果P(regex,i)和S(str,j)当前字符相当(或P是.),则结果与上一位置(i-1,j-1)相同。如果当前位置不等,则为False。如果当前位置P值为*,如果P上一位置与S当前相等或为”.”,则结果与上一S位置相同(i-1,j)。

动态规划的基本特点:先看到当前点最优情况,记录下来,到下一点看最优情况,记录,所有点完成后,取最后叠加最优。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值