能帮到你的话,就给个赞吧 😘
文章目录
回文
演示
125. 验证回文串
思想⭐
bool dp(string& s, int i, int j) {
if (i >= j)
return true;
return s[i] == s[j] && dp(s, i + 1, j - 1);
}
下位
01 516. 最长回文子序列⭐
思想⭐
同样的,最长回文子序列在区域中也是随机的。
但关键是它会不会影响下一个dp的计算。
即
设dp(i) = 3。3区域随机。下一个dp为dp(i + 1)。
区域随机可分为两种情况,
- 3挨着s[i + 1],也就是连续。
- 3不挨着,也就是不连续。
但可以发现,无论连续不连续,都无法判断s[i + 1] 与 dp(i)中的最长回文子序列是否构成新的回文子序列。
所以,dp的另一关键是找到能在遍历时即可判断元素是否属于题目特征。即o(1) = s[i] ∈ 题目特征。关键也就是o(1)
所以如何o(1)即可判断s[i + 1] 是 回文子序列
没错,就是设两端。
02 1312. 让字符串成为回文串的最少插入次数⭐
思想⭐
下位
01 1143. 最长公共子序列⭐⭐
思想⭐⭐
能够确定,dp的返回不一定非要点到底,可以是区域中的随机。
例如本题。
最长公共子序列是dp(i, j)中随机的。但它不影响下一个dp的计算。即
设dp(i, j) = 3。3是区域随机的。在dp(i + 1, j + 1)中,如果text1[i + 1] == text2[j + 1]。则
dp(i + 1, j + 1) = 4。
02 583. 两个字符串的删除操作⭐
相似题
712. 两个字符串的最小ASCII删除和
72. 编辑距离
思想⭐
本题与712一摸一样,但与72并不一样。
72的word2是固定值,没有操作。而本题的word2则是也要删除。
03 322. 零钱兑换⭐
题目特征⭐
04 10. 正则表达式匹配⭐
思想⭐
此题不难看出可以直接通过dp来做。
主要是情况比较复杂以及* 的认识。
题目特征⭐⭐
* 的认识⭐⭐
1.当p[j + 1] == ‘*’ && (p[j] == s[i] || p[j] == ‘.’)
*也不是匹配1-n个,也有可能匹配0个。
例如s = "aa", p = "a*aa" 和 s = "ab", p = ".*c"
2.在匹配多个情况下(>=1),需要遍历确认多少个。
然而此处可以通过递归优化。即
dp(s, i + 1, p, j)
即不需要遍历确认,而是通过递归省略遍历。
所以 * 的处理如下
if(p[j + 1] == '*'){
if(p[j] == s[i] || p[j] == '.')
return dp(s, i, p, j + 2) || dp(s, i + 1, p, j);
return dp(s, i, p, j + 2);
}
代码编写⭐
为什么使用j+1 == '*'更方便,而不是j == '*'
例如
s = "b", p = "ba*"
可以很直观的看到需要判断[j + 1] == ‘*’
底的处理⭐⭐
当i == s.size()
j要做的是判断能否匹配空串。