Given an input string (s) and a pattern §, 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 = “cab”
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 = “misisp*.”
Output: false
思路:
判断 p字符串中的第二位是否是*。
若是:则递归实现匹配0位或者多位当前的字符
若不是:则逐字符进行比较
package main
import "fmt"
func main() {
s := "aa"
p := "a*"
ret := isMatch(s, p)
fmt.Println(ret)
}
func isMatch(s string, p string) bool {
if len(p) == 0 {
return len(s) == 0
}
if len(p) == 1 {
return (len(s) == 1) && (s[0] == p[0] || p[0] == '.')
}
if p[1] != '*'{
if len(s) == 0{
return false
}
return (s[0] == p[0] || p[0] == '.') && isMatch(s[1:], p[1:])
}
for ; (len(s) >= 1) && (s[0] == p[0] || p[0] == '.'); {
if (isMatch(s, p[2:])){
return true
}
s = s[1:]
}
return isMatch(s, p[2:])
}