leetcode 131分割回文串

简介: leetcode 131分割回文串

分割回文串


229b354205154d7e86c888e517cde4f4.png

class Solution {
public:
    vector<vector<string>> result;
   //判断字串是否是回文串
    bool check(const string &s)
    {
        for(int i=0 ; i<s.size()/2 ; i++)
        {
            if(s[i] != s[s.size()- 1 -i]) return false;
        }
        return true;
    }
    void backtracking(string s , int indnx  ,vector<string> &path)
    {
      //当循环指针大于等于最大值的时候,认为分割出一种结果
        if(indnx >= s.size())
        {
            result.push_back(path);
            return;
        }
    //循环字符串长度,从index当前的运行指针开始切割回文串
        for(int i = indnx ; i<s.size() ;i++ )
        {
            string tmp;
            //切割字串,字串是indnx到i之间。
            for(int j = indnx ; j <= i ;j++)
            {
                tmp += s[j];
            }
            // cout<<tmp<<endl;
            //检验字串是否为回文串,是回文串压入路径,不是i+1,进行下一个长度加1的字串
            if(check(tmp)==1)   path.push_back(tmp);
            else continue;
            //如果当前字串是回文串,递归indnx加1
            backtracking(s,i+1,path);
            //回溯,弹出上一个字串
            path.pop_back();
        }
        return;
    }
    vector<vector<string>> partition(string s) {
        if(s.size()==0) return result;
        vector<string> path;
        backtracking(s,0,path);
        return result;
    }
};

二刷

class Solution {
public:
    vector<vector<string>> result;
    vector<string> path;
    bool cheak(string &s ,int start ,int end)
    {
        for(int i=start , j=end ; i<j ; i++,j--)
        {
            if(s[i] != s[j]) return false;
        }
        return true;
    }
    void track_back(string &s,int indnx)
    {
        if(indnx >= s.size()) 
        {
            result.push_back(path);
            return;
        }
        for(int i=indnx ; i<s.size() ;i++)
        {
            if(cheak(s,indnx,i) == true)
            {
                string tmp = s.substr(indnx,i-indnx+1);
                // cout<<tmp<<endl;
                path.push_back(tmp);
            }
            else continue;
            track_back(s,i+1);
            path.pop_back();
        }
        return;
    }
    vector<vector<string>> partition(string s) {
        track_back(s,0);
        return result;
    }
};
相关文章
|
5月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
247 1
|
Python
【Leetcode刷题Python】131. 分割回文串
LeetCode题目131的Python编程解决方案,题目要求将给定字符串分割成所有可能的子串,且每个子串都是回文串,并返回所有可能的分割方案。
127 2
|
Python
【Leetcode刷题Python】416. 分割等和子集
LeetCode 416题 "分割等和子集" 的Python解决方案,使用动态规划算法判断是否可以将数组分割成两个元素和相等的子集。
187 1
|
存储 算法 数据可视化
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
|
存储 算法 数据可视化
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
力扣经典150题第二十五题:验证回文串
力扣经典150题第二十五题:验证回文串
137 0
|
canal 算法 数据可视化
LeetCode 125题:验证回文串
LeetCode 125题:验证回文串
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
|
存储 算法 Java
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
147 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
251 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行