JZ52_正则表达式匹配
知识点:字符串、基础范围
题目链接
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
输入: “aaa”,“a*a”
输出: true
解题思路
- 采用递归的方法
- 返回的条件是 如果str和pattern同时走到底 说明匹配成功 若pattern先到底 str没到底 那么匹配不成功
- 如果str第二个是*
- 且str的第一个 和 pattern 的第一个相等 ,可以选择 注意这里可能出现.*的情况 也需要走进这个判断 且str不能为空
匹配一个, 继续调用函数(str.substr(1), pattern.substr(2))
匹配一个,仍然想向后匹配(str.substr(1), pattern)
一个都不匹配,仍给后面,(str, pattern.substr(2) - 如果不相等,则一个不匹配,往后找(str, pattern.substr(2)
- 如果str第二个不是* 且((str的第一个 和 pattern 的第一个相等) 或 (pattern的第一个是 . 且str不为空))
- 匹配一个(str.substr(1), pattern.substr(1))
代码
#include "cheader.h"
class Solution {
public:
bool matchCore(string str, string pattern){
if(str[0] == '\0' && pattern[0] == '\0')
return true;
if(str[0] != '\0' && pattern[0] == '\0')
return false;
if(pattern[1] == '*'){
if(pattern[0] == str[0] || (pattern[0] == '.' && str[0] != '\0')){
return matchCore(str.substr(1), pattern.substr(2)) || //就只匹配一个
matchCore(str.substr(1), pattern) || //匹配前面一个,但是也想往后匹配
matchCore(str, pattern.substr(2));//匹配0个字符
}
else{
return matchCore(str, pattern.substr(2)); //否则一个都不匹配
}
}
if(pattern[0] == str[0] || (pattern[0] == '.' && str[0] != '\0')) //或者有东西匹配
return matchCore(str.substr(1), pattern.substr(1));
return false;
}
bool match(string str, string pattern) {
if(str.length() == 0 && pattern.length() == 0){
return true;
}
return matchCore(str, pattern);
}
};
//leetcode 复杂低 https://blog.csdn.net/qq_30031221/article/details/115664939
#include "cheader.h"
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size(), n = p.size();
vector<vector<int>> dp(m+1,vector<int>(n+1));
dp[0][0] = 1;
for(int i = 0; i <= m; i++){ //起始位置很重要
for(int j = 1; j <= n; j++){
if(i > 0 && (p[j-1] == '.' || s[i-1] == p[j-1])) // 对应p是. 和 s[i-1]==p[j-1]
dp[i][j] = dp[i-1][j-1];
else if(p[j-1] == '*'){
dp[i][j] = dp[i][j-2]; //对应 一个都不匹配的情况
if(i > 0 && (s[i-1] == p[j-2] || p[j-2] == '.')) //对应和前面一个匹配 注意.* 也是可以的
dp[i][j] |= dp[i-1][j];
}else
dp[i][j] = 0; //否则为0
}
}
return dp[m][n];
}
};
今天也是爱zz的一天!