1- package g0001_0100.s0010_regular_expression_matching
2-
3- class Solution {
4- fun isMatch (text : String , pattern : String ): Boolean {
5- val dp = Array (text.length + 1 ) { BooleanArray (pattern.length + 1 ) }
6- dp[text.length][pattern.length] = true
7- for (i in text.length downTo 0 ) {
8- for (j in pattern.length - 1 downTo 0 ) {
9- val firstMatch = i < text.length && (pattern[j] == text[i] || pattern[j] == ' .' )
10- if (j + 1 < pattern.length && pattern[j + 1 ] == ' *' ) {
11- dp[i][j] = dp[i][j + 2 ] || firstMatch && dp[i + 1 ][j]
12- } else {
13- dp[i][j] = firstMatch && dp[i + 1 ][j + 1 ]
14- }
15- }
16- }
17- return dp[0 ][0 ]
18- }
19- }
1+ package g0001_0100.s0010_regular_expression_matching
2+
3+ class Solution {
4+ private lateinit var cache: Array <Array <Boolean ?>>
5+
6+ fun isMatch (s : String , p : String ): Boolean {
7+ cache = Array (s.length + 1 ) { arrayOfNulls(p.length + 1 ) }
8+ return isMatch(s, p, 0 , 0 )
9+ }
10+
11+ private fun isMatch (s : String , p : String , i : Int , j : Int ): Boolean {
12+ if (j == p.length) {
13+ return i == s.length
14+ }
15+ val result: Boolean
16+ if (cache[i][j] != null ) {
17+ return cache[i][j]!!
18+ }
19+ val firstMatch = i < s.length && (s[i] == p[j] || p[j] == ' .' )
20+ result = if (j + 1 < p.length && p[j + 1 ] == ' *' ) {
21+ firstMatch && isMatch(s, p, i + 1 , j) || isMatch(s, p, i, j + 2 )
22+ } else {
23+ firstMatch && isMatch(s, p, i + 1 , j + 1 )
24+ }
25+ cache[i][j] = result
26+ return result
27+ }
28+ }
0 commit comments