131. 分割回文串

题目描述

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

回文串 是正着读和反着读都一样的字符串。

示例 1:

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

示例 2:

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

提示:

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

解答

cpp 复制代码
class Solution {
public:
    vector<vector<string>> res;
    vector<string> path;
    vector<vector<string>> partition(string s) {
        res.clear();
        path.clear();
        backtrack(s, 0);
        return res;
    }

    void backtrack(string &s, int startidx)
    {
        // 分割起点大于等于字符串长度就说明本次分割完成,得到一组结果
        if(startidx >= s.size())
        {
            res.push_back(path);
            return;
        }

        // i 从 startidx 出发判断 [startidx, i]构成的字符串是否回文
        // 若是则加入临时结果中,进行后续的分割
        for(int i = startidx; i < s.size(); i++)
        {
            if(isPalindrome(s, startidx, i))
            {
                string str = s.substr(startidx, i - startidx + 1);
                path.push_back(str);
            }   
            else
            {
                continue;
            }
            backtrack(s, i + 1);
            path.pop_back();
        }
    }

    bool isPalindrome(string &str, int start, int end)
    {
        for(int i = start, j = end; i < j; i++, j--)
        {
            if(str[i] != str[j]) return false;
        }
        return true;
    }
};
相关推荐
元气代码鼠1 分钟前
C语言程序设计(进阶)
c语言·开发语言·算法
十雾九晴丶35 分钟前
攻防世界--->gametime
算法
司篂篂39 分钟前
axios二次封装
前端·javascript·vue.js
姚*鸿的博客1 小时前
pinia在vue3中的使用
前端·javascript·vue.js
Aurora_th1 小时前
树与图的深度优先遍历(dfs的图论中的应用)
c++·算法·深度优先·图论·dfs·树的直径
Jiaberrr3 小时前
JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)
前端·javascript·tree·树形·过滤筛选
马剑威(威哥爱编程)3 小时前
除了递归算法,要如何优化实现文件搜索功能
java·开发语言·算法·递归算法·威哥爱编程·memoization
我码玄黄3 小时前
THREE.js:网页上的3D世界构建者
开发语言·javascript·3d
算法萌新——13 小时前
洛谷P2240——贪心算法
算法·贪心算法
湖北二师的咸鱼3 小时前
专题:二叉树递归遍历
算法·深度优先