力扣131分隔回文串

news/2024/7/20 20:25:13 标签: leetcode, 深度优先, 算法

文章目录

  • 力扣131分隔回文串
    • 题目链接
    • 题目描述
    • AC代码--暴搜+剪枝
    • 暴搜+剪枝思路
    • AC代码--预处理+暴搜
    • 预处理+暴搜思路

力扣131分隔回文串

题目链接

原题链接

题目描述

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

示例 1:

输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
示例 2:

输入:s = “a”
输出:[[“a”]]

AC代码–暴搜+剪枝

class Solution {
public:
    vector<vector<string>> res; //所有方案
    vector<string> path; //一个合法方案
    vector<vector<string>> partition(string s) {
        dfs(0, s); //从位置0开始dfs
        return res;
    }

    void dfs(int u, string s)
    {
        if (u == s.size()) //遍历完整个字符串
        {
            res.push_back(path); //将路径加入方案
            return;
        }

        for (int i = u; i < s.size(); i ++) //枚举从当前字符到结尾可以选择的长度
        {
            if (check(s, u, i)) //判断u ~ i是否为回文串
            {
                path.push_back(s.substr(u, i - u + 1)); //加入路径
                dfs(i + 1, s); //递归下一层
                path.pop_back(); //回溯
            }
        }
    }

    bool check(string s, int l, int r) //判断从l到r是否为回文串
    {
        while (l <= r)
        {
            if (s[l ++] != s[r --])
                return false;
        }

        return true;
    }
};

暴搜+剪枝思路

见注释

AC代码–预处理+暴搜

class Solution {
public:
    vector<string> path;
    vector<vector<string>> ans;
    vector<vector<bool>> f;
    vector<vector<string>> partition(string s) {
        int n = s.size();
        f = vector<vector<bool>>(n, vector<bool>(n));
        for (int j = 0; j < n; j ++ )
            for (int i = 0; i <= j; i ++ )
                if (i == j) f[i][j] = true;
                else if (s[i] == s[j])
                {
                    if (i + 1 > j - 1 || f[i + 1][j - 1]) f[i][j] = true;
                }

        dfs(s, 0);
        return ans;
    }

    void dfs(string& s, int u)
    {
        if (u == s.size()) ans.push_back(path);
        else
        {
            for (int i = u; i < s.size(); i ++ )
            {
                if (f[u][i])
                {
                    path.push_back(s.substr(u, i - u + 1));
                    dfs(s, i + 1);
                    path.pop_back();
                }
            }
        }
    }
};

预处理+暴搜思路

其实就是预处理了u ~ i是否是回文串
原先每个元素都要判断一遍是或者不是,需要O(n^2)

至于预处理思路
f[i][j]:表示i ~ j都是回文
那么要使得f[i][j]是回文要有两个条件

  • s[i] == s[j]:两端元素相等
  • f[i + 1][j - 1]也是回文的:中间的元素相等
    也就是要使得f[i][j]是回文要有两个条件,两端相等+中间回文

http://www.niftyadmin.cn/n/5430417.html

相关文章

leetcode 判断是否为平衡二叉树

这个记得第一次写还是大二用c语言&#xff0c;当时非递归写了好久也没写完&#xff0c;用python递归思路简单&#xff0c;就是难想了一点&#xff0c;人生苦短&#xff0c;我用python哈哈哈.... 输入一棵二叉树的根节点&#xff0c;判断该树是不是平衡二叉树。如果某二叉树中任…

ESP32蓝牙系列一:初识ESP32的蓝牙

蓝牙相关的概念不在啰嗦&#xff0c;说到蓝牙的应用芯片就不得不提ESP32的芯片&#xff0c;直接上ESP32的蓝牙结构图 一、蓝⽛牙主机与控制器器的几种情况 1、在 ESP32 的系统上&#xff0c;选择 BLUEDROID 为蓝⽛牙主机&#xff0c;并通过 VHCI&#xff08;软件实现的虚拟 HC…

单目测距+姿态识别+yolov8界面+车辆行人跟踪计数

yolov5单目测距速度测量目标跟踪&#xff08;算法介绍和代码&#xff09; 1.单目测距实现方法 在目标检测的基础上&#xff0c;我们可以通过计算物体在图像中的像素大小来估计其距离。具体方法是&#xff0c;首先确定某个物体的实际尺寸&#xff0c;然后根据该物体在图像中的像…

easyexcel导出excel文件到s3服务器

导出excel文件是开发中常见的需求 常见的做法一般是直接通过请求接口响应对象HttpServletResponse把文件输出 我们可以使用原生的poi工具类操作.也可以使用easypoi.easyexcel等基于poi二次封装的工具处理 下面是代码 /*** 导出列表** param request* param response*/Overri…

peft模型微调--Prompt Tuning

模型微调&#xff08;Model Fine-Tuning&#xff09;是指在预训练模型的基础上&#xff0c;针对特定任务进行进一步的训练以优化模型性能的过程。预训练模型通常是在大规模数据集上通过无监督或自监督学习方法预先训练好的&#xff0c;具有捕捉语言或数据特征的强大能力。 PEF…

C++初阶 | [九] list 及 其模拟实现

摘要&#xff1a;介绍 list 容器&#xff0c;list 模拟实现 list&#xff08;带头双向循环列表&#xff09; 导入&#xff1a;list 的成员函数基本上与 vector 类似&#xff0c;具体内容可以查看相关文档(cplusplus.com/reference/list/list/)&#xff0c;这里不多赘述。以下对…

【析】一类动态车辆路径问题模型和两阶段算法

一类动态车辆路径问题模型和两阶段算法 摘要 针对一类动态车辆路径问题&#xff0c;分析4种主要类型动态信息对传统车辆路径问题的本质影响&#xff0c;将动态车辆路径问题(Dynamic Vehicle Routing Problem, DVRP)转化为多个静态的多车型开放式车辆路径问题(The Fleet Size a…

计算机视觉+人工智能碰撞出新的火花

计算机视觉&#xff08;CV&#xff09;技术的优势是其能够处理大量的图像和视频数据&#xff0c;并快速准确地提取出有用的信息。 1. 自动化&#xff1a;CV技术可以自动化地执行各种图像处理任务&#xff0c;例如目标检测、图像分类和图像分割。这样可以提高工作效率并降低人工…