zlx362211854 / daily-study

每日一个知识点总结,以issue的形式体现
10 stars 6 forks source link

114. 模拟实现正则中的星号(*) #170

Open goldEli opened 4 years ago

goldEli commented 4 years ago

星号(*)表示前面那个元素出现0次或者多次


/**
 * @param {string} s 字符串
 * @param {string} p 正则
 * @return {boolean}
 */
const isMatch = (s, p) => {
  // code some stuff
}

isMatch("aa", "a") // false
isMatch("aa", "a*") // true
isMatch("aaa", "a*") // true
isMatch("aaab", "a*b") // true
goldEli commented 4 years ago

思路:递归比对每一个字母

/**
 * @param {string} s 字符串
 * @param {string} p 正则
 * @return {boolean}
 */
const isMatch = (s, p) => {
  // 当正则与字符串匹配长度不一致返回 false,反之为 true
  if (!p) return !s
  const firstMatch = s[0] === p[0]
  /**
   * 如果正则第二字母包含星号
   * 1) 依次匹配字符串的字母
   * 2) 当 1)匹配结束后,将正则过滤掉星号和第一字母,匹配后续是否match 
   */
  if (p[1] === "*") {
    return (firstMatch && isMatch(s.substr(1), p)) || isMatch(s, p.substr(2))
  }
  return firstMatch && isMatch(s.substr(1), p.substr(1))
}
zlx362211854 commented 4 years ago
function isMatch(str, reg) {
    var r = reg.split('*')
    // "a"
    if (r.length === 1) return false
    if (r[1] === '') {
    // a*
      return str.indexOf(r[0]) === -1 ? false : true
    } else {
    // a*b
      return str.indexOf(r[1]) === -1 ? false : true
    }
}