回溯(子集型):分割回文串

一、多维递归 -> 回溯

1.1:17. 电话号码的字母组合(力扣hot100)

  • 代码:
python 复制代码
mapping = ["","", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        n = len(digits)
        if n == 0:
            return []
        res = []
        path = [""] * n
        def dfs(i):                              # 一个子问题的具体细节
            if i==n:
                res.append("".join(path))
                return
            for c in mapping[int(digits[i])]:
                path[i] = c
                dfs(i+1)                       # 下一个子问题
        dfs(0)
        return res

二、子集型回溯

2.1:78. 子集

  • 代码:
python 复制代码
class Solution:
	'''
	站在输入的角度,每个数都可选或不选
	最终每个叶子就是答案
	'''
    def subsets(self, nums: List[int]) -> List[List[int]]:
        if len(nums) == 0:
            return []
        res = []
        path = []
        n = len(nums)
        def dfs(i):
            if i==n:
                res.append(path.copy())
                return
            
            dfs(i+1)                # 不选

            path.append(nums[i])    # 选
            dfs(i+1)
            path.pop()   # 记得恢复现场
            
        dfs(0)
        return res

class Solution:
    """
    站在答案的角度,第一个数选谁,第二个数选谁,...
    每个节点都是答案子集
    """
    def subsets(self, nums: List[int]) -> List[List[int]]:
        if len(nums) == 0:
            return []
        res = []
        path = []
        n = len(nums)
        def dfs(i):
            res.append(path.copy())  # 每个节点都直接添加
            if i==n:
                return
            for j in range(i, n):
                path.append(nums[j])    # 下一个数选谁
                dfs(j+1)
                path.pop()   # 记得恢复现场
            
        dfs(0)
        return res

2.2:131. 分割回文串

  • 代码:
python 复制代码
class Solution:
    """
    站在答案的角度,第一个数选谁,第二个数选谁,...
    每个节点都是答案
    """
    def partition(self, s: str) -> List[List[str]]:
        res = []
        path = []
        n = len(s)
        def dfs(i):
            if i==n:
                res.append(path.copy())  # 这里是答案包含全部字符,所以只有最后一把才记录结果
                return 
            for j in range(i, n):
                t = s[i:j+1]
                if t==t[::-1]:
                    path.append(t)
                    dfs(j+1)
                    path.pop()
        dfs(0)
        return res
相关推荐
zander2582 小时前
LeetCode 5. 最长回文子串
算法
hanlin033 小时前
刷题笔记:力扣第84题-柱状图中最大的矩形
笔记·算法·leetcode
青少儿编程课堂4 小时前
威佐夫博弈(双堆取子游戏)解析
c++·python·算法·bfs·信息学竞赛
hhzz4 小时前
【OpenCV 入门到精通 03】图像入门:读取、显示、保存完全指南
人工智能·python·opencv·计算机视觉
金融小师妹5 小时前
AI趋势识别:黄仁勋宣布“AGI时代”到来,Astra能力跃迁背后的AI安全边界
大数据·python·深度学习·重构·逻辑回归
2501_941875288 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
辰烨chenye8 小时前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
hfywmsj8 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
泡海椒11 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb11 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析