dp3——二维

本文介绍了回文字符串的相关算法,包括验证回文串的思路,最长回文子序列、最少插入次数的解决方案,以及与最长公共子序列和正则表达式匹配的联系,涉及零钱兑换问题和特殊字符*的处理方法。
摘要由CSDN通过智能技术生成

能帮到你的话,就给个赞吧 😘


回文

演示

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)。
区域随机可分为两种情况,

  1. 3挨着s[i + 1],也就是连续。
  2. 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要做的是判断能否匹配空串。

相似题目

44. 通配符匹配
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值