正则表达式匹配

  1. 题目描述
    1. 解题思路

题目描述

请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。

在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”ab*a”均不匹配

解题思路

  • 递归匹配,多重状态递归。
  • “.” 匹配任意一个字符
  • “*” 匹配0个或者多个前一个字符
class Solution {
public:
    bool match(char* str, char* pattern)
    {
        // 异常输入处理
        if (str == nullptr || pattern == nullptr){
            return false;
        }
        return matchCore(str,pattern);
    }
    
private:
    bool matchCore(char* str,char* pattern){
        if (*str == '\0' && *pattern == '\0') {// 模式匹配成功
            return true;
        }
        if (*str != '\0' && *pattern == '\0') {// 模式匹配失败
            return false;
        }
        
        if (*(pattern + 1) == '*'){ // 模式的第二个字符是*,可以有无数个
            // 匹配上了,或者可以匹配任意一个字符
            if (*pattern == *str || (*pattern == '.' && *str != '\0')){
                // 其实这里存在不合理的情况,一定会导致false,不过只要有一个true就行了
                return matchCore(str + 1,pattern + 2)   // 移动到下一个状态,且忽略*,*匹配0个字符
                    || matchCore(str + 1,pattern)       // 保持在当前模式状态
                    || matchCore(str,pattern + 2);      // .* 组合模式,忽略 *,*匹配0个字符
            } else { // 当前字符不匹配,且不是“.”
                return matchCore(str,pattern + 2);      //忽略 *,*匹配0个字符
            }
        }
        // 匹配上了,或者可以匹配任意一个字符
        if (*str == *pattern || (*pattern == '.' && *str != '\0')) {
            return matchCore(str + 1,pattern + 1); // 都后移一位
        }
        return false;
    }
};

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

💰

Title:正则表达式匹配

Count:427

Author:攀登

Created At:2019-12-26, 23:12:31

Updated At:2024-06-15, 15:53:35

Url:http://jiafeimao-gjf.github.io/2019/12/26/sword-%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8C%B9%E9%85%8D/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation