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

一、多维递归 -> 回溯

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
相关推荐
李可以量化1 分钟前
Tornado 从入门到精通(二)下:协程调用方式与经典使用模式
python
wabs6666 分钟前
关于图论【最短路径之Bellman_ford 算法(判断负权回路)|卡码网95.城市间货物运输II的思考】
数据结构·算法·图论·bellman_ford算法·卡码网·判断负权回路
雪碧透心凉_10 分钟前
Python OpenCV图像处理入门
图像处理·python·opencv
YouonlyliveonceC21 分钟前
《大话数据结构》第4章实战:中缀表达式转后缀 + 后缀表达式求值(完整可运行实现)
算法
李可以量化24 分钟前
Tornado 从入门到精通(二)上:协程核心机制详解
python
晴天1627 分钟前
AgentLoop分享(上): 让 AI 真正“自主干活“-Day15
人工智能·python
phoenix@Capricornus30 分钟前
从统计决策到贝叶斯估计
人工智能·算法·机器学习
Patrick在香港35 分钟前
Python爬虫框架实战:优雅抓取香港政府公开API数据的通用方案
java·开发语言·爬虫·python·ai编程·数据可视化·可用性测试
AICDragon38 分钟前
1.8%就够了:K3的896个MoE专家,为什么激活率这么低反而是好事?
人工智能·算法
VALENIAN瓦伦尼安教学设备1 小时前
ASHOOTER激光对中仪如何通过颜色确定调整是否合适
数据库·嵌入式硬件·算法