LeetCode 10. Regular Expression Matching

'.' Matches any single character.
'*' Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true

#include <string>
#include <iostream>
using namespace std;

/*
  Explain:
  1: the key point to solve the problem is to get the '*' position.
  Suppose, the j + 1 position is not '*', it is easly to handle.
           if s[i] == p[j] || s[i] is any char, p[j] == '.'
              Example ------> "aabc", "aa.c"
              we need to match the s, i + 1, p, j + 1 left characters.
          However, if the j + 1 position is '*', we need to list several cases.
          2.1: if s[i] == p[j] && p[j+1] == '*', * is repeating of s[i] char.
                  Example -----> "aaaaaa" "a*"
                  we need to either match (s, i, p, j+2) or i is always increasing...
          2.2: if p[j] == '.', s[i] is any char
                  Example ----> "aaaaaa" "a.*"
                  Example ----> "aaabc" "a.*bc"
                  we need to match (s, i, p, j + 2) || i is always increasing... ".*" can match any char.
          2.3 is neither happen, it must be this case "bb" "a*bb"
                  we need to match (s, i, p, j + 2)

*/
bool isMatch(string s, int i, string p, int j) {
  if(i == s.size()) return j == p.size();
  if(p[j+1] != '*') {
    if(s[i] == p[j] || (i != s.size() && p[j] == '.'))
      return isMatch(s, i + 1, p, j + 1);
    return false;
  } else {
    while(s[i] == p[j] || (p[j] == '.' && i != s.size())) {
      if(isMatch(s, i, p, j + 2)) return true;
      i++;
    }
    return isMatch(s, i, p, j + 2);
  }
}

bool isMatch(string s, string p) {
  return isMatch(s, 0, p, 0);
}

int main(void) {
  cout << isMatch("bb", "a*bb") << endl;
-- INSERT --                                        




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值