Leetcode 131 分割回文串(纯DFS)

news/2025/1/31 9:41:05 标签: leetcode, 算法, 职场和发展

131. 分割回文串https://leetcode.cn/problems/palindrome-partitioning/https://leetcode.cn/problems/palindrome-partitioning/

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

示例 1:

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

示例 2:

输入:s = "a"
输出:[["a"]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

DFS方案1:初始化一个代表分割点的01数组,然后对这个数组的状态使用dfs搜索。这个方案耗时长,空间复杂度也不小。具体代码如下:

class Solution {
public:
    vector<vector<string>> ans;
    bool cutoff[20] = {false};//代表分割点的01数组
    bool check(string s)//判断回文串
    {
        string ss = s;
        reverse(s.begin(),s.end());
        if(ss==s)
            return true;
        else return false;
    }

    void dfs(string s,int cur)//枚举每一个位置,有在该点分割与不分割两种情况
    {
        if(cur == s.size())
        {
            vector<string> temp;
            int i = 0;
            while(true)
            {
                string t;
                t.push_back(s[i]);
                i++;
                while(!cutoff[i])
                {
                    t.push_back(s[i]);
                    i++;
                }
                if(!check(t))
                    return;
                else temp.push_back(t);
                if (i >= s.size())
                    break;
            }
            ans.push_back(temp);
            return;
        }

        cutoff[cur] = true;
        dfs(s,cur+1);
        cutoff[cur] = false;
        dfs(s,cur+1);
    }

    vector<vector<string>> partition(string s) 
    {
        //为了整体代码和谐,将首尾都设为分割
        cutoff[0] = true;
        cutoff[s.size()] = true;
        dfs(s,1);
        return ans;
    }
};

DFS方案2:从前到后直接枚举分割点。如下图:

这个方案更快些,具体差别在该方案能及时排除不可能选项,而不是等上一个方案把所有可能情况全列出来然后对每个依次排除。代码具体如下:

class Solution {
public:
    vector<vector<string>> ans;
    vector<string> temp;

    bool check(string s)
    {
        string ss = s;
        reverse(s.begin(),s.end());
        if(ss==s)
            return true;
        else return false;
    }

    void dfs(int startindex,const string s)//前者代表起始点
    {
        if(startindex==s.size())
        {
            ans.push_back(temp);
            return;
        }
        for(int i = startindex;i<s.size();++i)
        {
            string str = s.substr(startindex,i-startindex + 1);
            if(check(str))
            {
                temp.push_back(str);
                dfs(i+1,s);
                temp.pop_back();
            }
            else continue;
        }
    }

    vector<vector<string>> partition(string s) 
    {
        dfs(0,s);
        return ans;
    }
};

顺便说一道几乎一样的题:

93. 复原 IP 地址https://leetcode.cn/problems/restore-ip-addresses/

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245""192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

示例 3:

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

提示:

  • 1 <= s.length <= 20
  • s 仅由数字组成

思路几乎一致,都是要求分割的字符串所有情况,唯一不同的是这道题有些额外的条件,但都很好解决,具体代码如下:

class Solution {
public:
    vector<string> ans;
    vector<string> temp;
 
    inline int transform(string s)//字符串转数字
    {
        int t = 0;
        int re = 0;
        for(int i = s.size()-1;i>=0;i--,t++)
        {
            re+=(s[i] - '0')*pow(10,t);
        }
        return re;
    }

    bool check(string s)
    {
        string ss = s;
        reverse(s.begin(),s.end());
        if(ss==s)
            return true;
        else return false;
    }
 
    void dfs(int startindex,const string s)//前者代表起始点
    {
        if(temp.size()>4)//很明显的剪枝
            return;
        if(startindex==s.size()&&temp.size()==4)
        {
            string str;
            for(int i = 0;i<temp.size();++i)
            {
                for(int j = 0;j<temp[i].size();++j)
                {
                    str.push_back(temp[i][j]);
                }
                str.push_back('.');
            }
            str.pop_back();
            ans.push_back(str);
            return;
        }
        for(int i = startindex;i<s.size();++i)
        {
            string str = s.substr(startindex,i-startindex + 1);
            if((str.size()>=2&&str[0] == '0')||str.size()>3||transform(str)>255)//由题得出的筛选条件
                continue;
            temp.push_back(str);
            dfs(i+1,s);
            temp.pop_back();
        }
    }
    vector<string> restoreIpAddresses(string s) {
        dfs(0,s);
        return ans;
    }
};


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

相关文章

[Java]泛型(二)泛型方法

1.定义 在 Java 中&#xff0c;泛型方法是指在方法声明中使用泛型类型参数的一种方法。它使得方法能够处理不同类型的对象&#xff0c;而不需要为每种类型写多个方法&#xff0c;从而提高代码的重用性。 泛型方法与泛型类不同&#xff0c;泛型方法的类型参数仅仅存在于方法的…

PYH与MAC的桥梁MII/MIIM

在学习车载互联网时&#xff0c;看到了一句话&#xff0c;Processor通过DMA直接存储访问与MAC之间进行数据的交互&#xff0c;MAC通过MII介质无关接口与PHY之间进行数据的交互。常见的以太网硬件结构是&#xff0c;将MAC集成进Processor芯片&#xff0c;将PHY留在Processor片外…

如何解除TikTok地区限制:实用方法解析

随着社交媒体的不断发展&#xff0c;TikTok作为一款短视频平台&#xff0c;已经在全球范围内吸引了数以亿计的用户。然而&#xff0c;不同地区对TikTok的使用权限存在一定的限制&#xff0c;这使得一些用户无法享受平台提供的完整内容和功能。 一、了解TikTok地区限制的原因 在…

智能家居监控系统数据收集积压优化

亮点&#xff1a;RocketMQ 消息大量积压问题的解决 假设我们正在开发一个智能家居监控系统。该系统从数百万个智能设备&#xff08;如温度传感器、安全摄像头、烟雾探测器等&#xff09;收集数据&#xff0c;并通过 RocketMQ 将这些数据传输到后端进行处理和分析。 在某些情况下…

计算机网络之链路层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 02 数据链路层 在网上看到其他人做了详细的笔记&#xff0c;就不再多余写了&#xff0c;直接参考着学习吧。 1 详解数据链路层-数据链路层的功能【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51C…

MATLAB的数据类型和各类数据类型转化示例

一、MATLAB的数据类型 在MATLAB中 &#xff0c;数据类型是非常重要的概念&#xff0c;因为它们决定了如何存储和操作数据。MATLAB支持数值型、字符型、字符串型、逻辑型、结构体、单元数组、数组和矩阵等多种数据类型。MATLAB 是一种动态类型语言&#xff0c;这意味着变量的数…

剑指 Offer II 009. 乘积小于 K 的子数组

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20009.%20%E4%B9%98%E7%A7%AF%E5%B0%8F%E4%BA%8E%20K%20%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84/README.md 剑指 Offer II 009. 乘积小于 K 的子数组 题目描述 给…

Git进阶之旅:.gitignore 文件

介绍&#xff1a; 在项目中&#xff0c;我们可能一起提交多个文件 git add -A&#xff1a;提交所有变化git add -u&#xff1a;提交被修改(modified) 和被删除文件(deleted) 文件&#xff0c;不包括新文件(new) git add .&#xff1a;提交新文件(new) 和被修改文件(modif…