forked from wufenggirl/LeetCode-in-Golang
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathregular-expression-matching.go
executable file
·52 lines (46 loc) · 1.23 KB
/
regular-expression-matching.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package problem0010
func isMatch(s, p string) bool {
sSize := len(s)
pSize := len(p)
dp := make([][]bool, sSize+1)
for i := range dp {
dp[i] = make([]bool, pSize+1)
}
/* dp[i][j] 代表了 s[:i] 能否与 p[:j] 匹配 */
dp[0][0] = true
/**
* 根据题目的设定, "" 可以与 "a*b*c*" 相匹配
* 所以,需要把相应的 dp 设置成 true
*/
for j := 1; j < pSize && dp[0][j-1]; j += 2 {
if p[j] == '*' {
dp[0][j+1] = true
}
}
for i := 0; i < sSize; i++ {
for j := 0; j < pSize; j++ {
if p[j] == '.' || p[j] == s[i] {
/* p[j] 与 s[i] 可以匹配上,所以,只要前面匹配,这里就能匹配上 */
dp[i+1][j+1] = dp[i][j]
} else if p[j] == '*' {
/* 此时,p[j] 的匹配情况与 p[j-1] 的内容相关。 */
if p[j-1] != s[i] && p[j-1] != '.' {
/**
* p[j] 无法与 s[i] 匹配上
* p[j-1:j+1] 只能被当做 ""
*/
dp[i+1][j+1] = dp[i+1][j-1]
} else {
/**
* p[j] 与 s[i] 匹配上
* p[j-1;j+1] 作为 "x*", 可以有三种解释
*/
dp[i+1][j+1] = dp[i+1][j-1] || /* "x*" 解释为 "" */
dp[i+1][j] || /* "x*" 解释为 "x" */
dp[i][j+1] /* "x*" 解释为 "xx..." */
}
}
}
}
return dp[sSize][pSize]
}