专注 效率 记忆
预习 笔记 复习 做题
欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!
本博客带大家一起学习,我们不图快,只求稳扎稳打。
由于我高三是在家自学的,经验教训告诉我,学习一定要长期积累,并且复习,所以我推出此系列。
只求每天坚持40分钟,一周学5天,复习2天
也就是一周学10道题
50天后我们就可以学完76道题,相信50天后,我们一定可以有扎实的代码基础!我们每天就40分钟,和我一起坚持下去吧!
qq群:866984458
本题出自 acwing网站
这个系列是免费的
打卡即刻退回费用。
第十天【剑指Offer例题代码 系列】
- 18. 正则表达式匹配(动态规划)
- 字符串匹配 dp思想
- 19. 表示数值的字符串(模拟)
18. 正则表达式匹配(动态规划)
原题链接
字符串匹配 dp思想
- 字符串匹配多是动态规划算法
- 那么常规f[i][j] 表示前i个和前j个匹配
- 分析样例
- 如果出现.,那么一定匹配
- 如果是*,就看*前面1个是否和p串匹配
或者是前2个是否匹配,并且要注意判断前2个是否是.,也表示匹配
注意以上两点,就可以写本题了
class Solution {
public:
vector<vector<int>> dp;
bool isMatch(string s, string p) {
int sn = s.size() ; int pn = p.size() ;
dp = vector<vector<int>>(sn+10, vector<int>(pn+10, 0));
dp[0][0] = 1;
for (int i = 0; i <= sn; i++) {
for (int j = 1; j <= pn; j++) {
if (i > 0 && p[j - 1] == '.' ) {
dp[i][j] = dp[i - 1][j - 1];
}
else if (i > 0 && p[j - 1] != '*' && p[j-1] == s[i-1]) {
dp[i][j] = dp[i - 1][j - 1];
}
else if (p[j - 1] == '*') {
//*
if (j > 1 && dp[i][j - 2] == 1)
dp[i][j] = 1;
else if (i > 0 && j > 1 && (p[j - 2] == '.' || p[j - 2] == s[i - 1]) && dp[i - 1][j] == 1)
dp[i][j] = 1;
}
}
}
return dp[sn ][pn ];
}
};
19. 表示数值的字符串(模拟)
原题链接
class Solution {
public:
bool isNumber(string s) {
int i = 0;
while (i < s.size() && s[i] == ' ') i ++ ;
int j = s.size() - 1;
while (j >= 0 && s[j] == ' ') j -- ;
if (i > j) return false;
s = s.substr(i, j - i + 1);
if (s[0] == '-' || s[0] == '+') s = s.substr(1);
if (s.empty() || s[0] == '.' && s.size() == 1) return false;
int dot = 0, e = 0;
for (int i = 0; i < s.size(); i ++ )
{
if (s[i] >= '0' && s[i] <= '9');
else if (s[i] == '.')
{
dot ++ ;
if (e || dot > 1) return false;
}
else if (s[i] == 'e' || s[i] == 'E')
{
e ++ ;
if (i + 1 == s.size() || !i || e > 1 || i == 1 && s[0] == '.') return false;
if (s[i + 1] == '+' || s[i + 1] == '-')
{
if (i + 2 == s.size()) return false;
i ++ ;
}
}
else return false;
}
return true;
}
};