LeetCoder 10. Regular Expression Matching

题意

一个目标串S,一个模式串P,判断二者是否匹配,其中几种匹配规则

  • ’ . ‘可以表示任意的单个字符
  • ’ * ‘可以代表它之前的字符的任意个数,可以为0或者更多

几个例子:

  • 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

感觉应该解释一下最后一组样例,因为第一次看的时候没看懂,”c*a*b”可以写成”c0a2b”,那么得出的字符串中’ * ‘代表即为0个c,2个a,结果匹配.

思路

i 代表S串的位置下标,j代表P串的位置下标

  • S串遍历完成
    • P串遍历完成, 匹配成功
    • P串未遍历完成,如果 j+1 位置的字符为*,检查 j+2 后面的字符串是否匹配,否则匹配不成功
  • S串遍历未完成
    • P串遍历完成,匹配不成功
    • P串未遍历完成
      • j+1 位置的字符不为*,如果 i 处字符和j处字符匹配(包括 j 处字符为’ . ‘的情况),继续递归向下检查i+1 j+1 后面的字符串,否则匹配不成功
      • j+1 位置的字符为,如果 i 处字符和j处字符无法匹配(包括 j 处字符为’ . ‘的情况),那么递归检查i j+2 后面的字符串,如果检查成功,那么匹配成功,否则也需要递归检查 i j+2 后面的字符串,如果检查成功,那么匹配成功,否则要暴力检查S串和P串是否匹配,其实这里的暴力是为了检查能够匹配几个前面的字符,期间如果有一个能够检查成功,即为匹配成功。

结果

很尴尬啊!!!
Your runtime beats 6.74 % of cpp submissions.

代码

class Solution {
public:
    bool isMatch(string s, string p) {
        return check(0, 0, s, p);
    }
    bool check(size_t i, size_t j, string s, string p){
        if(i == s.length()){
            if(j == p.length()) return true;
            if(p[j + 1] == '*') return check(i, j + 2, s, p);
            else return false;
        } else{
            if(j == p.length()) return false;
            if(p[j + 1] != '*'){
                if(s[i] == p[j] || p[j] == '.') return check(i + 1, j + 1, s, p);
                return false;
            } else{
                if(s[i] != p[j] && p[j] != '.') return check(i, j + 2, s, p);
                if(check(i, j + 2, s, p)) return true;
                size_t k = 0;
                while(k + i + 1 <= s.length() && (s[k + i] == p[j] || p[j] == '.')){
                    if(check(k + i + 1, j + 2, s, p))
                        return true;
                    k++;
                }
                return false;
            }
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值