leetcode练习 分割回文串

给你一个字符串 s,请你将s分割成一些子串,使每个子串都是

回文串

。返回 s 所有可能的分割方案。

示例 1:

复制代码
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

复制代码
输入:s = "a"
输出:[["a"]]

提示:

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

思路,我们可以采用回溯算法,找到每一个字符串的组合,再判断是否是回文串,在回溯函数中,我们采用一个for循环更新容器大小用来截取字符串长度。

cpp 复制代码
class Solution {
public:
    vector<vector<string>>res;
    vector<string>path;
    bool is_fun(int left,int right,string s){
        if(left>right)return false;
        while(left<right){
            if(s[left]!=s[right])return false;
            left++;
            right--;
        }
        return true;
    }
    void backtracing(int left,int right,string s){
        if(left>right){
            res.push_back(path);
            return ;
        }
        for(int i=0;i<right-left+1;i++){
            if(is_fun(left,left+i,s)){
                path.push_back(s.substr(left,i+1));
                backtracing(left+i+1,right,s);
                path.pop_back();
            }
        }
    }
    vector<vector<string>> partition(string s) {
        backtracing(0,s.size()-1,s);
        return res;
    }
};

给定字符串大小除去上面方法外,我们还可以使用substr函数,我认为这样写更加清晰,在判断是否是回文串时可以直接重新计算字符串的left和right,像上面函数中写的,在调用is_fun函数时,我第一次写时传错参数is_fun(left.i,s)导致开头传错判断错误。

cpp 复制代码
       for(int i=1;i<=right-left+1;i++){
            if(is_fun(s.substr(left,i))){
                path.push_back(s.substr(left,i));
                backtracing(left+i,right,s);
                path.pop_back();
            }
相关推荐
LYFlied16 分钟前
【每日算法】LeetCode 64. 最小路径和(多维动态规划)
数据结构·算法·leetcode·动态规划
Salt_072843 分钟前
DAY44 简单 CNN
python·深度学习·神经网络·算法·机器学习·计算机视觉·cnn
货拉拉技术44 分钟前
AI拍货选车,开启拉货新体验
算法
MobotStone1 小时前
一夜蒸发1000亿美元后,Google用什么夺回AI王座
算法
Wang201220131 小时前
RNN和LSTM对比
人工智能·算法·架构
xueyongfu1 小时前
从Diffusion到VLA pi0(π0)
人工智能·算法·stable diffusion
永远睡不够的入1 小时前
快排(非递归)和归并的实现
数据结构·算法·深度优先
cheems95271 小时前
二叉树深搜算法练习(一)
数据结构·算法
sin_hielo1 小时前
leetcode 3074
数据结构·算法·leetcode
Yzzz-F1 小时前
算法竞赛进阶指南 动态规划 背包
算法·动态规划