g0001_0100.s0010_regular_expression_matching.Solution Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of leetcode-in-java21 Show documentation
Show all versions of leetcode-in-java21 Show documentation
Java-based LeetCode algorithm problem solutions, regularly updated
package g0001_0100.s0010_regular_expression_matching;
// #Hard #Top_100_Liked_Questions #Top_Interview_Questions #String #Dynamic_Programming #Recursion
// #Udemy_Dynamic_Programming #Big_O_Time_O(m*n)_Space_O(m*n)
// #2023_08_09_Time_1_ms_(100.00%)_Space_41.1_MB_(61.00%)
/**
* 10 - Regular Expression Matching\.
*
* Hard
*
* Given an input string `s` and a pattern `p`, implement regular expression matching with support for `'.'` and `'*'` where:
*
* * `'.'` Matches any single character.
* * `'*'` Matches zero or more of the preceding element.
*
* The matching should cover the **entire** input string (not partial).
*
* **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 preceding 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
*
* **Constraints:**
*
* * `1 <= s.length <= 20`
* * `1 <= p.length <= 30`
* * `s` contains only lowercase English letters.
* * `p` contains only lowercase English letters, `'.'`, and `'*'`.
* * It is guaranteed for each appearance of the character `'*'`, there will be a previous valid character to match.
**/
public class Solution {
private Boolean[][] cache;
public boolean isMatch(String s, String p) {
cache = new Boolean[s.length() + 1][p.length() + 1];
return isMatch(s, p, 0, 0);
}
private boolean isMatch(String s, String p, int i, int j) {
if (j == p.length()) {
return i == s.length();
}
boolean result;
if (cache[i][j] != null) {
return cache[i][j];
}
boolean firstMatch = i < s.length() && (s.charAt(i) == p.charAt(j) || p.charAt(j) == '.');
if ((j + 1) < p.length() && p.charAt(j + 1) == '*') {
result = (firstMatch && isMatch(s, p, i + 1, j)) || isMatch(s, p, i, j + 2);
} else {
result = firstMatch && isMatch(s, p, i + 1, j + 1);
}
cache[i][j] = result;
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy