46.正则表达式匹配
题目内容:
代码及思路:
诸如这道题,笔试的时候经常出现类似的字符串操作。
首先来理解一下题目,以题目中的栗子为例:字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
原因是对于a.a,'.'可以表示任意一个字符,因此该处的'.'可以表示a;
对于ab*ac*a,对于第一个'*'表示前一个数字即b可以出现任意次(包括0次)因此我们设定b出现0次,同理可得第二个位置处的'*'作用相同,c出现零次。因此这两个都与aaa匹配。
而aa.a与ab*a同理可得就不能匹配了。
#include<iostream>
#include<string>
using namespace std;
class Solution
{
public:
bool match(char* str, char* pattern)
{
//对无效输入进行判断
if (*str == '\0'&&*pattern == '\0')
return true;
if (*str != '\0'&&*pattern == '\0')
return false;
//对出现的正则情况进行分类
//如果下一个字符不为*
if (*(pattern + 1) != '*')
{
//当前字符相等,或者str不为空,pattern该处是'.'。则继续下一位的判断
if (*str == *pattern || (*str != '\0'&&*pattern == '.'))
return match(str + 1, pattern + 1);
else // 否则则不匹配
return false;
}
else
{
//如果下一位是'*',则要判断当前位
if (*str == *pattern || (*str != '\0'&&*pattern == '.'))
return match(str, pattern + 2)||match(str+1,pattern);
else //当前位要是不等,则直接跳过pattern的两位
{
return match(str, pattern + 2);
}
}
}
};
void main()
{
Solution* object = new Solution;
string str1, pattern;
getline(cin, str1);
getline(cin, pattern);
char* str = &str1[0];
char* pat = &pattern[0];
bool res = object->match(str, pat);
cout << res << endl;
}