剑指offer 学习笔记 正则表达式匹配

面试题19:正则表达式匹配。请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的’.‘表示任意一个字符,而’*'表示它左面的一个字符可以出现任意次(含0次),本题中,匹配是指字符串的所有字符匹配整个模式,即模式中有一种情况与要匹配的串相同则匹配成功。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。.*可匹配任何字符串。

当模式中的第二个字符不是’*'时:
1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。
2、如果字符串第一个字符和模式中的第一个字符不匹配,直接返回false。

而当模式中的第二个字符是’*'时,可以有3种匹配方式:
1、模式后移2字符,相当于x*被忽略;
2、字符串后移1字符,模式后移2字符,x*相当于只匹配一个字符;
3、字符串后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位;

#include <iostream>
using namespace std;

bool MatchCore(const char* str, const char* pattern) {
    if (*str == '\0' && *pattern == '\0') {
        return true;
    }
    if (*pattern == '\0' && *str != '\0') {    // 在pattern结束时若str还没结束,则不匹配
        return false;                        // 但当str结束,pattern还没结束,可能pattern还有类似a*的可以为空的子串,不能判断是否结束
    }
  
    if (*(pattern + 1) == '*') {
        if (*str == *pattern || (*pattern == '.' && *str != '\0')) {
            return MatchCore(str + 1, pattern)    // 当a*匹配多个a时
                || MatchCore(str + 1, pattern + 2)   // 当a*匹配一个a时
                || MatchCore(str, pattern + 2);    // 当a*.匹配a时
        } else {
            return MatchCore(str, pattern + 2);    // 当b匹配a*时,把a*跳过
        }
    } else {
        if (*str == *pattern || (*pattern == '.' && *str != '\0')) {    // 若匹配当前字符
            return MatchCore(str + 1, pattern + 1);
        } else {
            return false;
        }
    } 
}

bool match(const char *str, const char *pattern) {
    if (str == nullptr || pattern == nullptr) {    // 输入空串不会return,因为空串并不是空指针
        return false;
    }

    return MatchCore(str, pattern);
}

int main() {
    if (match("d", "d*d*.")) {
        cout << "匹配成功。" << endl;
    } else {
        cout << "匹配失败。" << endl;
    }
    return 0;
}
posted @   epiphanyy  阅读(3)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示