Leetcode 2911. Minimum Changes to Make K Semi-palindromes

  • [Leetcode 2911. Minimum Changes to Make K Semi-palindromes](#Leetcode 2911. Minimum Changes to Make K Semi-palindromes)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题属实也是把我坑惨了......

坦率地说,这道题本身并没有啥难度,但是坑爹的是题目表述简直有毒,有两个细节题目里面压根没提,一个是我从中文版本的题目当中发现的,另一个则是我根据失败的样例当中反推出来的,这简直有毒......

这道题本身思路上还是挺直接的,就是一个动态规划的题目,考虑每一种切分的方式,然后考察其中最小的变化次数即可。

然后对于每一个切分得到的子串,我们要求其变化所需的最小变化次数,我们只需要找到其所有对长度 l l l整除的 d d d,然后切分semi子串,再考察其中每一种分法下所需的变化次数之和,最后取最小值即可。

因此,我们就将上述题目拆分完成了,后续只要对其实现一下即可,测试发现是可以在有效时间内完成所有测试样例的。

但是,这里但是就来了,题目中遗漏了两个非常非常重要的说明,把我给坑惨了!!!

首先,这里semi-palindrome的定义事实上要求将其使用d进行切分后,每一个子串都得是回文 ,其次,题中也没有具体说,但是实际测试发现,这里对子串的切分要求每一个子串长度至少为2

这简直就是简直了!!!

到底谁出的题目啊,只能说,出来挨打!!!

2. 代码实现

给出python代码实现如下:

python 复制代码
class Solution:
    def minimumChanges(self, s: str, k: int) -> int:
        n = len(s)
        
        @lru_cache(None)
        def count(sub):
            cnt = 0
            n = len(sub)
            for i in range(n//2):
                if sub[i] != sub[n-1-i]:
                    cnt += 1
            return cnt
        
        @lru_cache(None)
        def count_change(s):
            if s == s[::-1]:
                return 0
            n = len(s)
            ans = count(s)
            for d in range(len(s)//2, 0, -1):
                if n % d != 0:
                    continue
                k = n // d
                cnt = 0
                for i in range(d):
                    sub = "".join([s[i+j*d] for j in range(k)])
                    cnt += count(sub)
                ans = min(ans, cnt)
            return ans
        
        @lru_cache(None)
        def dp(idx, k):
            if idx+2*k > n:
                return math.inf
            elif k == 1:
                return count_change(s[idx:])
            return min(count_change(s[idx:j]) + dp(j, k-1) for j in range(idx+2, n))
        
        ans = dp(0, k)
        return ans   

提交代码评测得到:耗时5650ms,占用内存71.8MB。

相关推荐
绵绵细雨中的乡音15 小时前
动态规划-第六篇
算法·动态规划
程序员黄同学15 小时前
动态规划,如何应用动态规划解决实际问题?
算法·动态规划
脑子慢且灵17 小时前
蓝桥杯冲刺:一维前缀和
算法·leetcode·职场和发展·蓝桥杯·动态规划·一维前缀和
小王努力学编程19 小时前
动态规划学习——回文子串系列问题【C++】
c++·学习·算法·leetcode·动态规划
Espresso Macchiato1 天前
Leetcode 3500. Minimum Cost to Divide Array Into Subarrays
leetcode·动态规划·leetcode hard·leetcode 3500·leetcode双周赛153
工一木子1 天前
大厂算法面试 7 天冲刺:第5天- 递归与动态规划深度解析 - 高频面试算法 & Java 实战
算法·面试·动态规划
pen-ai1 天前
【NLP】15. NLP推理方法详解 --- 动态规划:序列标注,语法解析,共同指代
人工智能·自然语言处理·动态规划
烁3472 天前
每日一题(小白)动态规划篇2
算法·动态规划
Dream it possible!2 天前
LeetCode 热题 100_打家劫舍(83_198_中等_C++)(动态规划)
c++·算法·leetcode·动态规划
烁3472 天前
每日一题(小白)动态规划篇5
算法·动态规划