leetcode - 1216. Valid Palindrome III

这篇具有很好参考价值的文章主要介绍了leetcode - 1216. Valid Palindrome III。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Description

Given a string s and an integer k, return true if s is a k-palindrome.

A string is k-palindrome if it can be transformed into a palindrome by removing at most k characters from it.

Example 1:

Input: s = "abcdeca", k = 2
Output: true
Explanation: Remove 'b' and 'e' characters.

Example 2:

Input: s = "abbababa", k = 1
Output: true

Constraints:

1 <= s.length <= 1000
s consists of only lowercase English letters.
1 <= k <= s.length

Solution

Recursive

Similar to 680. 验证回文字符串 Ⅱ, this time we could delete k characters.

Similarly, use recursive + memo.

Time complexity: o ( n k ) o(nk) o(nk)
Space complexity: o ( n k ) o(nk) o(nk)

Longest Palindromic Sequence

We can find the longest palindromic sequence in s, and if len(longest_palindromic_sequence) + k > len(s), that means even after deleting k characters, the string is still not palindromic.

Time complexity: o ( n 2 ) o(n^2) o(n2)
Space complexity: o ( n 2 ) o(n^2) o(n2)文章来源地址https://www.toymoban.com/news/detail-834632.html

Code

Recursive

class Solution:
    def isValidPalindrome(self, s: str, k: int) -> bool:
        memo = {}
        def helper(left: int, right: int, k: int) -> bool:
            if (left, right, k) in memo:
                return memo[(left, right, k)]
            while left <= right:
                if s[left] == s[right]:
                    left += 1
                    right -= 1
                elif k > 0:
                    res = helper(left + 1, right, k - 1) or helper(left, right - 1, k - 1)
                    break
                else:
                    res = False
                    break
            memo[(left, right, k)] = res if left <= right else True
            return memo[(left, right, k)]
        return helper(0, len(s) - 1, k)

Longest Palindromic Sequence

class Solution:
    def isValidPalindrome(self, s: str, k: int) -> bool:
        def longest_palindromic_sequence(s: str) -> int:
            dp = [[0] * len(s) for _ in range(len(s))]
            # init
            for i in range(len(s)):
                dp[i][i] = 1
            # dp
            for i in range(len(s) - 2, -1, -1):
                for j in range(i + 1, len(s)):
                    if s[i] == s[j]:
                        dp[i][j] = 2 + dp[i + 1][j - 1]
                    else:
                        dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
            return dp[0][len(s) - 1]
        lps = longest_palindromic_sequence(s)
        return len(s) - lps <= k

到了这里,关于leetcode - 1216. Valid Palindrome III的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构——图解链表OJ题目

            学完了单链表之后,我们对其基本结构已经有了一定的了解,接下来我们通过一些题目强化对链表的理解,同时学习一些面试笔试题目的新思路以及加强对数据结构单链表的掌握。  目录 题目一.876. 链表的中间结点 - 力扣(LeetCode) 题目二:21. 合并两个有序链表

    2024年02月04日
    浏览(65)
  • 链表OJ题目1 (移除链表元素)

    力扣(链接放这里喽)  先贴代码再做讲解:     我们应该先将情况考虑周全,画图分析思路 : 我们假设有上述这种情况,按照题目设想,前面三个6都应该free掉,从3这个位置开始,也就是说我们要返回的头就从此处开始,所以我们先考虑值相等,过掉再继续。 在这个位

    2024年02月12日
    浏览(43)
  • 【C++】二叉搜索树经典OJ题目

    解题思路 这道题是让我们使用前序遍历的方式来创建字符串,但是有一点需要注意的是,再创建的字符串中,需要将每一个左右子树用括号括起来。这里扩括号的时候有两点需要注意的细节: 当左右子树都为空时,该节点左右子树的括号都可以省略掉。 当左子树不为空,右

    2024年02月05日
    浏览(41)
  • 【LeetCode 算法】Unique Paths III 不同路径 III 暴力DFS

    在二维网格 grid 上,有 4 种类型的方格: 1 表示起始方格。且只有一个起始方格。 2 表示结束方格,且只有一个结束方格。 0 表示我们可以走过的空方格。 -1 表示我们无法跨越的障碍。 返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目

    2024年02月14日
    浏览(51)
  • 王道机试指南(第二版)——题目OJ链接

    王道机试指南(第二版)——题目OJ链接 方便大家跳转检验,侵删。 题目 地址 例题2.1 abc(清华大学复试上机题) 例题2.2 反序数(清华大学复试上机题) 例题2.3 对称平方数1(清华大学复试上机题) 习题2.1 与7无关的数(北京大学复试上机题) 习题2.2 百鸡问题(北京哈尔

    2024年01月17日
    浏览(47)
  • 二叉树OJ题目合集(单值、对称、平衡、构建加遍历)

    目录 前言: 一:单值二叉树 二:二叉树遍历 核心点 (1)前序 (2)中序 (3)后序 三:判断两颗树是否相同 四:判断二叉树是否对称 五:判断一颗树是否为另一颗树的子树 六:平衡二叉树 七:二叉树的构建加遍历 这一部分适合已经 适用于已经掌握二叉树基础的同学(遍历,求节

    2024年02月02日
    浏览(37)
  • leetcode 630. 课程表 III

    这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。 你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。 返回你最多可以修读的课

    2024年02月16日
    浏览(43)
  • 【LeetCode:216. 组合总和 III + 递归】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年04月25日
    浏览(60)
  • Leetcode—216.组合总和III【中等】

    之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

    2024年01月23日
    浏览(44)
  • 【数据结构】二叉树的相关操作以及OJ题目

    当一个树不是满二叉树或完全二叉树时,它是不适合使用数组存储的,它应该使用链式结构来存储。 再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是: 空树 非空:根节点,根节点的左子树、根节点的右子树组成的。 从概念中可以看出,二叉树定义是递归式的,因

    2024年03月19日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包