zoukankan      html  css  js  c++  java
  • 关于力扣第十题 ---正则表达式匹配

    题目描述:

    给定一个字符串 (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 }; 
  • 相关阅读:
    洛谷P1199三国游戏
    Cracking the Coding Interview 6.2
    Cracking the Coding Interview 5.2
    Cracking the Coding Interview 5.7
    洗牌算法
    字符串排列组合问题
    指针作为形参
    KMP算法代码
    搜索二叉树
    面试题集锦
  • 原文地址:https://www.cnblogs.com/myfate/p/10469400.html
Copyright © 2011-2022 走看看