嗯~~这个题实际上就是[动态规划]BM76 正则表达式匹配-较难。既然是动态规划专题,就再写一次咯~~
DP21 正则表达式匹配
描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
数据范围:
1.str 只包含从 a-z 的小写字母。
2.pattern 只包含从 a-z 的小写字母以及字符 . 和 *,无连续的 '*'。
3.
4.
输入描述:
第一行输入一个字符串 str。
第二行输入一个字符串 pattern。
输出描述:
输出两个字符串的匹配结果,如果匹配则输出 true ,否则输出 false
示例1
输入:
aaa
a*a
输出:
true
示例2
输入:
aab
c*a*b
输出:
true
示例3
输入:
a
.*
输出:
true
示例4
输入:
aaab
a*a*a*c
输出:
false
题解
递归解法
#include <bits/stdc++.h>
using namespace std;
bool match(const std::string &text, const std::string &pattern, int i, int k)
{
if (i == text.size() && k == pattern.size())
{
return true;
}
if (i > text.size() || k > pattern.size())
{
return false;
}
if (i == text.size())
{
if (pattern[k] == '*')
{
return (match(text, pattern, i - 1, k + 1) || match(text, pattern, i, k + 1));
}
return (k + 1) < pattern.size() && pattern[k + 1] == '*' && (match(text, pattern, i, k + 2));
}
if (text[i] == pattern[k] || pattern[k] == '.')
{
return match(text, pattern, i + 1, k + 1);
}
if (k > 0 && pattern[k] == '*')
{
if (pattern[k - 1] == '.' || pattern[k - 1] == text[i - 1])
{
return match(text, pattern, i - 1, k + 1) || match(text, pattern, i, k + 1) || match(text, pattern, i, k - 1);
}
else
{
return match(text, pattern, i - 1, k + 1);
}
}
else if (k + 1 < pattern.size() && pattern[k + 1] == '*')
{
return match(text, pattern, i, k + 2);
}
return false;
}
int main()
{
std::string a, b;
std::cin >> a >> b;
std::cout << (match(a, b, 0, 0) ? "true" : "false") << std::endl;
return 0;
}
动态规划解法
见[动态规划]BM76 正则表达式匹配-较难