题目描述:
给定一个字符串 (s
) 和一个字符模式 (p
)。实现支持 '.'
和 '*'
的正则表达式匹配。
'.' 匹配任意单个字符。 '*' 匹配零个或多个前面的元素。
匹配应该覆盖整个字符串 (s
) ,而不是部分字符串。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符.
和*
。
示例 1:
输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入: s = "aa" p = "a*" 输出: true 解释: '*' 代表可匹配零个或多个前面的元素, 即可以匹配 'a' 。因此, 重复 'a' 一次, 字符串可变为 "aa"。
示例 3:
输入: s = "ab" p = ".*" 输出: true 解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
示例 4:
输入: s = "aab" p = "c*a*b" 输出: true 解释: 'c' 可以不被重复, 'a' 可以被重复一次。因此可以匹配字符串 "aab"。
示例 5:
输入: s = "mississippi" p = "mis*is*p*." 输出: false
解题方法1:
1 var isMatch = function(s, p) { 2 const tokens = tokenize(p) 3 return innerMatch(s, tokens) 4 }; 5 6 // 匹配 7 function innerMatch(substr, tokens) { 8 if (tokens.length === 0) { 9 return substr === '' 10 } 11 if (substr === '') { 12 return (tokens.filter(item => item.slice(-1) !== '*').length === 0) 13 } 14 15 const nextTokens = tokens.slice(1) 16 const t = tokens[0] 17 18 if (t === '.') { 19 return innerMatch(substr.slice(1), nextTokens) 20 } else if (t === '.*') { 21 for (let i = 0; i < substr.length + 1; i++) { 22 if (innerMatch(substr.slice(i), nextTokens)) { 23 return true 24 } 25 } 26 return false 27 } else if (t[t.length - 1] === '*') { 28 for (let i = 0; i < substr.length + 1; i++) { 29 if (i > 0 && substr[i - 1] !== t[0]) { 30 return false 31 } 32 if (innerMatch(substr.slice(i), nextTokens)) { 33 return true 34 } 35 } 36 return false 37 } else { 38 if (substr.slice(0, t.length) !== t) { 39 return false 40 } 41 return innerMatch(substr.slice(t.length), nextTokens) 42 } 43 } 44 45 // 正则表达式序列化 46 function tokenize(p) { 47 const tokens = [] 48 let item = '' 49 for (let i = 0; i < p.length; i++) { 50 if (p[i] === '.') { 51 if (item.length > 0) { 52 tokens.push(item) 53 } 54 item = '.' 55 } else if (p[i] === '*') { 56 if (item === '') { 57 throw new Error() 58 } 59 if (item.length === 1) { 60 tokens.push(item + '*') 61 } else { 62 tokens.push(item.slice(0, -1)) 63 tokens.push(item.slice(-1) + '*') 64 } 65 item = '' 66 } else { 67 if (item === '.') { 68 tokens.push('.') 69 item = p[i] 70 } else { 71 item += p[i] 72 } 73 } 74 } 75 if (item.length > 0) { 76 tokens.push(item) 77 } 78 return tokens 79 }
解题方法2(正则表达式):
简单粗暴
1 var isMatch = function(s, p) { 2 var reg=new RegExp("^"+p+"$","g"); 3 return reg.test(s); 4 };