text: // LeetCode 10. 正则表达式匹配 https://leetcode-cn.com/problems/regular-expression-matching/
  // LintCode 154. 正则表达式匹配 https://www.lintcode.com/problem/regular-expression-matching/description
  
  // 'mississippi', 'mis*is*ip*.' 测试不通过
  // export default (str, mode) => {
  //   const strLen = str.length
  //   const modeArr = mode.match(/([a-z.]\*)|([a-z]+(?=([a-z.]\*)|$))/g) // 筛选无模式和有模式
  
  //   if (!modeArr) return false
  
  //   let cur = 0
  //   for (let n = 0, len = modeArr.length; n < len; n++) {
  //     // 匹配模式结果分类
  //     // 分三类：.*|a*|bcde
  //     const s = modeArr[n].split('')
  //     if (s[1] === '*') { // 如果第二位是'*'，则为有模式
  //       if (s[0] === '.') { // 第一种模式
  //         return true
  //       } else { // 第二种模式，直接移到相等的最后面
  //         while (str[cur] === s[0]) {
  //           cur++
  //         }
  //       }
  //     } else { // 无模式
  //       for (let i = 0, sLen = s.length; i < sLen; i++) {
  //         if (s[i] !== str[cur++]) { // 注意，cur++每一次都会被执行
  //           return false
  //         }
  //       }
  //     }
  //   }
  
  //   return cur === strLen
  // }
  
  export default (str, mode) => {
    const isMatch = (s, p) => {
      // 边界情况，如果s和p都为空，说明处理结束了，返回true，否则返回false
      if (p.length <= 0) {
        return !s.length
      }
      // 判断p模式字符串的第一个字符和s字符串的第一个字符是不是匹配
      let match = false
      if (s.length > 0 && (p[0] === s[0] || p[0] === '.')) {
        match = true
      }
      // p有模式的
      if (p.length > 1 && p[1] === '*') {
        // 第一种情况：s*匹配0个字符
        // 第二种情况：s*匹配1个字符，递归下去，用来表示s*匹配多个s
        return isMatch(s, p.slice(2)) || (match && isMatch(s.slice(1), p))
      } else {
        return match && isMatch(s.slice(1), p.slice(1))
      }
    }
  
    return isMatch(str, mode)
  }
  