package LeetCode_10
/**
* 10. Regular Expression Matching
* https://leetcode.com/problems/regular-expression-matching/description/
*
* 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).
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 (.)".
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 *.
* */
class Solution {
/*
* solution: recursion, Time complexity:O(n*n), Space complexity:O(n*n)
* n is min(s.length, p.length)
* */
fun isMatch(s: String, p: String): Boolean {
if (p == null || p.isEmpty()) {
return s.isEmpty()
}
if (s == p) {
return true
}
if (p.length >= 2 && p[1] == '*') {
//if p's second character is *, so p can match any number of character before *
if (isMatch(s, p.substring(2))) {
//check remaining character
return true
}
//otherwise, check first character match or not
if (s.isNotEmpty() && (s[0] == p[0] || p[0] == '.')) {
return isMatch(s.substring(1), p)
}
} else if (s.isNotEmpty() && (s[0] == p[0] || p[0] == '.')) {
//need check character one by one
return isMatch(s.substring(1), p.substring(1))
}
return false
}
}