字符串经典题之正则匹配字符串

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串经典题之正则匹配字符串相关的知识,希望对你有一定的参考价值。

题目

字符串通配符
在这里插入图片描述

注意

此题和LeetCode 10:正则表达式匹配这道题虽然看着一样,但是本质不一样。力扣上的这道题,对于*匹配的是它前面的0个或多个,是单个字符,而牛客的这道题*匹配任意字符串多次
在这里插入图片描述
关于力扣的这道题,有兴趣的读者可以查看这篇博客,其难度要比本题高很多

动态规划之正则表达式匹配字符串

思路

仔细分析,其实很简单。采用两个指针分别扫描模式串和字符串,如果两个指针指向的字符相同,那么就比较下一个,如果模式串遇到?,那么对于目标串可以是任意。如果模式串遇到*,那么这个*可以匹配目标串的0个,1个以及多个字符。如果两者都扫描到了字符串结束标志,匹配成功,否则失败

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


bool isMatch(const char* pattern,const char* target)
{
    if(*pattern=='\\0' && * target=='\\0')//如果都到了字符串结束标志,那么匹配成功
        return true;
    if(*pattern=='\\0'|| *target=='\\0')//有任何一个先结束,返回失败
        return false;
    
    if(*pattern=='?')//?号可以匹配任意字符
        return isMatch(pattern+1, target+1);
    else if(*pattern=='*')//*共有三种情况
        return isMatch(pattern+1, target+1) //情况1:匹配一个字符
        || isMatch(pattern+1, target) //情况2:匹配0个字符
        || isMatch(pattern, target+1);//情况3:匹配多个字符,直接递归
    else if(*pattern==*target)
        return isMatch(pattern+1,target+1);//如果对应字符相等,同时向后移动判断下一个
    
    return false;//除此之外,全部失败
    
    
}

int main()
{
    string pattern;
    string target;
    while(cin >> pattern >> target)
    {
        bool res=isMatch(pattern.c_str(),target.c_str());//注意传入字符串指针
        if(res)
            cout<<"true"<<endl;
        else
            cout<<"false"<<endl;
    }
    
}

在这里插入图片描述

以上是关于字符串经典题之正则匹配字符串的主要内容,如果未能解决你的问题,请参考以下文章

动态规划经典题之编辑距离

循环通过 python 正则表达式匹配

JAVA正则表达式怎么匹配所有符合要求的子字符串

字符串经典题之大数相加

字符串经典题之参数解析

Java开发经典实战!java正则表达式匹配字符串替换