首页 > 其他分享 >线性DP-2430. 对字母串可执行的最大删除数

线性DP-2430. 对字母串可执行的最大删除数

时间:2022-10-04 21:46:29浏览次数:51  
标签:abc lcp 删除 字母 2430 range DP 线性 dp

问题描述

给你一个仅由小写英文字母组成的字符串 s 。在一步操作中,你可以:
删除 整个字符串 s ,或者
对于满足 1 <= i <= s.length / 2 的任意 i ,如果 s 中的 前 i 个字母和接下来的 i 个字母 相等 ,删除 前 i 个字母。
例如,如果 s = "ababc" ,那么在一步操作中,你可以删除 s 的前两个字母得到 "abc" ,因为 s 的前两个字母和接下来的两个字母都等于 "ab" 。
返回删除 s 所需的最大操作数。

示例 1:
输入:s = "abcabcdabc"
输出:2
解释:

  • 删除前 3 个字母("abc"),因为它们和接下来 3 个字母相等。现在,s = "abcdabc"。
  • 删除全部字母。
    一共用了 2 步操作,所以返回 2 。可以证明 2 是所需的最大操作数。
    注意,在第二步操作中无法再次删除 "abc" ,因为 "abc" 的下一次出现并不是位于接下来的 3 个字母。

示例 2:
输入:s = "aaabaab"
输出:4
解释:

  • 删除第一个字母("a"),因为它和接下来的字母相等。现在,s = "aabaab"。
  • 删除前 3 个字母("aab"),因为它们和接下来 3 个字母相等。现在,s = "aab"。
  • 删除第一个字母("a"),因为它和接下来的字母相等。现在,s = "ab"。
  • 删除全部字母。
    一共用了 4 步操作,所以返回 4 。可以证明 4 是所需的最大操作数。

示例 3:
输入:s = "aaaaa"
输出:5
解释:在每一步操作中,都可以仅删除 s 的第一个字母。

提示:
1 <= s.length <= 4000
s 仅由小写英文字母组成

问题求解

典型的线性dp,核心问题在于如何加速字符串匹配。
这里可以预处理一个lcp(最长公共前缀)来加速判断。

class Solution:
    def deleteString(self, s: str) -> int:
        n = len(s)

        lcp = [[0 for _ in range(n + 1)] for _ in range(n + 1)]
        for i in range(n - 1, -1, -1):
            for j in range(n - 1, -1, -1):
                if s[i] == s[j]:
                    lcp[i][j] = lcp[i + 1][j + 1] + 1
        
        dp = [0] * n
        for i in range(n - 1, -1, -1):
            dp[i] = 1
            for j in range(i + 1, i + (n - i) // 2 + 1):
                if lcp[i][j] >= j - i:
                    dp[i] = max(dp[i], dp[j] + 1)
        
        return dp[0]

标签:abc,lcp,删除,字母,2430,range,DP,线性,dp
From: https://www.cnblogs.com/hyserendipity/p/16754555.html

相关文章

  • dp----在一些意想不到的地方用到了dp
    《题一:SubsequencePath》原题链接:https://atcoder.jp/contests/abc271/tasks/abc271_e原题详细题解:https://atcoder.jp/contests/abc271/editorial/4940题目大意:有......
  • TCP与UDP的联系与区别
    UDP(UserDataProtocol,用户数据报协议)1、UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网......
  • DP专题
    分治优化DP分治优化1D/1Ddp对于一类\[f(x)=\min_{k=y}^{x-1}w(l,r)\]即所有\(w(l,r)\)事先已知,且\(f(x)\)满足决策单调性(即\(w(l,r)\)满足区间包含单......
  • 数位DP
    Acwing338.计数问题给定两个整数 aa 和 bb,求 aa 和 bb 之间的所有数字中 0∼90∼9 的出现次数。例如,a=1024,b=1032a=1024,b=1032,则 aa 和 bb 之间共有 99......
  • 【Ynoi2009】 rla1rmdq 题解 (离线分块 + 线性空复处理)
    洛谷传送门分块。Solution看到是区修区查,还有时限,不难想到是分块,根号复杂度。然后看到空间复杂度,需要离线下来转为线性复杂度。考虑如何分块。观察操作性质,发现节点......
  • 「CF1455G」Forbidden Value 题解 (DP,线段树合并)
    题目简介已知初始值\(x=0\),给定下面\(2\)种命令:set\(y\)\(v\),令\(x=y\),或花费\(v\)元钱删除该命令;if\(y\)...end,如果\(x==y\),执行if...end中的命令,否则跳......
  • 角度传感器数据信息显示线性度好
    角度传感器数据信息显示线性度好采用非接触原理360度传感,机械轴传动采用两只双密封式轴承,转动灵敏度高。连接轴采用不锈钢304制造,品质出色。该产品可取代早期塑料电阻产品,寿......
  • C# UdpClient发送超过1500字节MTU的数据包会怎么样
    如果不设置DontFragmentudpClient.DontFragment=false;那么可以发送数据包。接收端随缘收到数据包。使用WireShark可以检测到网卡上对应的数据包。如果设置DontFragm......
  • UDP程序设计
    UDP程序设计​无连接,不可靠的数据报协议-->简单,快捷域名系统,简单网络管理协议(SNMP),网络文件系统(NFS),动态主机配置协议(DHCP),实时传输协议RTP服务器端:创建socket......
  • 洛谷 CF550C Divisibility by Eight(DP/数论)
    遇事不决,小学数学。https://www.luogu.com.cn/problem/CF550C题目大意:给你一个位数不超过100的非负整数N(不含前导0)。你的任务是判断这个数字能否通过去掉其中......