首页 > 编程语言 >【回溯算法】应用 2

【回溯算法】应用 2

时间:2023-07-05 18:26:17浏览次数:45  
标签:子串 start 算法 result 应用 回溯 path dp 回文

目录

应用

应用1:Leetcode 131. 分割回文串

题目

131. 分割回文串

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

分析

首先使用动态规划,计算所有的子串是否是回文子串,然后再通过回溯的方式枚举所有的子串组合即可。

这里,我们用 \(f(i,j)\) 表示子串 \(s[i \cdots j]\) 是否是回文子串。

容易看出来,如果 \(s[i \cdots j]\) 满足以下条件之一:

  • 子串长度为 \(1\),此时,\(i = j\);

  • 子串为空串,此时,\(i \gt j\);

  • 子串的首尾字符相同,即\(s[i] = s[j]\),且 \(s[i + 1\cdots j - 1]\) 是回文子串,此时,它可以由上一个状态 \(f(i + 1, j - 1)\) 转移而来。

那么,\(s[i \cdots j]\) 就是回文子串。

因此,它的状态转移方程为:

\[f(i,j) = \begin{cases} True,&i \ge j\\ (s[i] == s[j]) \land f(i + 1, j - 1), &otherwise \end{cases} \]

其中,\(\land\) 表示逻辑与运算。

然后,我们再使用回溯的方式,枚举所有的子串,通过 \(f(i,j)\) 判断子串是否是回文子串。

代码实现

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        n = len(s)
        dp = [[True] * n for _ in range(n)]

        for i in range(n - 1, -1, -1):
            for j in range(i + 1, n):
                dp[i][j] = s[i] == s[j] and dp[i + 1][j - 1]

        result = list()
        self.dfs(dp, s, n, list(), result, 0)
        return result

    def dfs(self, dp, s, n, path, result, start):
        """ 通过回溯的方式,枚举所有的子串组合 """
        if start == n:
            result.append(path[:])

        for i in range(start, n):
            if dp[start][i]:
                path.append(s[start:i + 1])
                self.dfs(dp, s, n, path, result, i + 1)
                path.pop()
        return

参考:

标签:子串,start,算法,result,应用,回溯,path,dp,回文
From: https://www.cnblogs.com/larry1024/p/17529373.html

相关文章

  • WPF 在MVVM模式下应用动画
    一个简单的需求:当程序发生异常时候,在界面上动画显示异常信息。这个需求看似简单,只需要try……catch到异常,然后把异常的信息写入界面就OK了。但在MVVM时,就不是这么简单了。MVVM模式下,追求前后端的分离。然后catch到的异常,也只能在后台代码中。如果传递到前台呢?这自然就想到了Bin......
  • RV1126按键中断驱动和应用调试
     本人使用的调试平台是荣品的rv1126开发板,最近在调试按键中断。经过查看原理图,发现竟然没有一个空闲的IO,所以使用UART1的RX作为按键中断引脚。    驱动部分:     因为UART1原先已经在设备树中已经有了定义,需要将kernel/arch/arm/boot/dts/rongpin/rv1126_11......
  • 智能控制:BL102 PLC网关在泵站中的自动化应用
    随着工业智能化的快速发展,BL102PLC网关作为一种先进的工业自动化设备,在泵站远程监测领域发挥了重要的作用。通过BL102PLC网关,我们可以实现对泵站PLC的远程监测和控制,从而提高泵站的工作效率和管理水平。 一、BL102PLC网关的功能和应用场景BL102PLC网关是一种......
  • 企业为什么需要软件的应用框架?
    软件框架是可用来构建软件的结构。它充当系统的基础,使开发者不必从头开始创建,比如非必要的额外逻辑。框架还类似于模板,你可以对其进行修改并添加某些特性和更高级功能,然后创建许多人可以使用的复杂而普适的项目。软件的应用框架是软件系统的一层抽象,是提供了通用的软件功能,可以通......
  • MongoDB数据库部署与应用
    MongoDB数据库部署与应用拓扑图:推荐步骤:在Centos01上安装mongoDB数据库管理mongoDB服务生成MongoDB配置文件通过控制文件控制MongoDB服务,配置MongoDB身份验证配置mongoDB身份验证管理和修改配置文件支持验证配置mongoDB基本管理配置MongoDB数据备份恢复实验步骤:一.在Centos01上安装m......
  • python基础 进程、操作系统调度算法、同步异步、开启进程、process类的参数、进程锁、
    进程概念进程、线程都是操作系统中的基本概念,也就是说进程和线程都是操作系统层的东西,专业术语表达就是进程和线程的使用都是由操作系统来调度的‘,而不是由我们来操控的。在操作系统这门课里,进程和线程是操作系统的概念,协程不是操作系统中的概念,而是我们程序层面的......
  • 【快应用】ad-button按钮与加桌组件文案调试
    ​ 【关键词】体验版、文案配置、广告、加桌 【问题背景】快应用引擎版本更新到1106版本后,广告ad-button和加桌组件新增了预制文案配置,仅支持使用已有的,不再支持自定义文案。在使用最新版本的加载器进行调试的时候,设置的文案不能生效仍是显示的是默认的文案,该如何处理?代码......
  • 19-知识图谱在反欺诈中的应用
    19.知识图谱在反欺诈中的应用知识图谱的应用价值19.1知识图谱的应用(1)对多源异构数据和多维复杂关系的处理与可视化展示:将人类社会生活与生产活动中难以用数学模型直接表示的关联属性,利用语义网络和专业领域知识进行组织存储,形成一张以关系为纽带的数据网络,通过对关系的挖掘与......
  • MySQL数据库8.0.29-8.0.31版本使用 INSTANT 算法新增字段bug
    xxx下发MySQL数据库共性隐患排查通知,要求统一排查MySQL数据库8.0.29及以后版本使用INSTANT算法新增字段后期变更回滚可能导致数据库宕机的隐患,排查方法及整改方法详见下表和附件。请各分支()数据库运营人员集中排查隐患,及时整改。 隐患概述MySQL数据库8.0.29及以后版本......
  • 【阿里二面面试题】说说你对 Raft 算法的理解?
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家✌......