【剑指offer】052-正则表达式匹配

题目

请实现一个函数用来匹配包括’.’和’*‘的正则表达式。模式中的字符’.’表示任意一个字符,而’*‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配

思路

本题的难点在于*的处理。碰到*需要判断*前的字符是否匹配,应该匹配几个的问题。既然需要判断*前的字符,那我们在循环处理的时候就,需要能访问到*前的字符,所以我们在比较某个字符的时候,先判断下一个字符是否为*
使用递归,将s和pattern字符串一个个字符进行比对,当比对到某个字符时候,判断下一个字符是否为*
下一个字符不是号,则正常处理,判断当前是否相等,相等则进入下一个字符,不相等则正则匹配失败
下一个字符是
号,可以分为两种情况,
当前字符不相等,不相等则,pattern直接跳过两个字符
相等,则考虑匹配0个或1个字符,再继续递归进去,这样就可以考虑所有情况了

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// s, pattern都是字符串
function match (s, pattern{
  // write code here
  if (s.length === 0 && pattern.length === 0return true
  else if (s.length !== 0 && pattern.length === 0return false
  else {
    if (pattern[1] !== '*') {
      if ((s.length > 0 && pattern[0] === '.') || s[0] === pattern[0]) {
        return match(s.substring(1), pattern.substring(1))
      } else {
        return false
      }
    } else {
      if ((s.length > 0 && pattern[0] === '.') || s[0] === pattern[0]) {
        return match(s, pattern.substring(2)) || match(s.substring(1), pattern)
      } else {
        return match(s, pattern.substring(2))
      }
    }
  }
}
文章作者: ptp
文章链接: https://youyingjie114.github.io/2019/11/07/jz-offer/jz-offer-052/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PTP'S BLOG