题目:
Given an input string (s
) and a pattern (p
), implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
Note:
s
could be empty and contains only lowercase lettersa-z
.p
could be empty and contains only lowercase lettersa-z
, and characters like.
or*
.
代码(c++):
class Solution {
public:
//利用动态规划求解
bool isMatch(string s, string p) {
//定义两个指针分别指向字符串s以及字符串p
int pos_p = 0;
//定义一个数组代表最优子问题的当前解
vector<bool> dp_cur;
dp_cur.push_back(true);
for(int i = 0; i < s.length(); i++) dp_cur.push_back(false);
//进行动态规划
while(pos_p < p.length()) {
vector<bool> dp_temp = dp_cur;
//出现‘*’的情况
if(pos_p + 1 < p.length() && p[pos_p+1] == '*') {
//遍历
for(int i = 0; i < dp_cur.size(); i++) {
if(dp_cur[i] == true) {
while(i < s.length()) {
if(s[i] == p[pos_p] || p[pos_p] == '.') {
i++;
dp_temp[i] = true;
}
else break;
}
}
}
pos_p = pos_p + 2;
}
//单字符情况
else {
//遍历
for(int i = 0; i < dp_cur.size(); i++) {
if(dp_cur[i] == true) {
dp_temp[i] = false;
while(i < s.length() && dp_cur[i] == true) {
if(s[i] == p[pos_p] || p[pos_p] == '.') {
i++;
dp_temp[i] = true;
}
else break;
}
}
}
pos_p = pos_p + 1;
}
dp_cur = dp_temp;
}
if(dp_cur[s.length()] == true) return true;
else return false;
}
};