字符串经典题之正则匹配字符串
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;
}
}
以上是关于字符串经典题之正则匹配字符串的主要内容,如果未能解决你的问题,请参考以下文章