195.回溯算法:分割回文串(力扣)

代码解决

cpp 复制代码
class Solution {
public:
    vector<string> res; // 当前路径,用于存储一个可能的回文分割结果
    vector<vector<string>> result; // 存储所有可能的回文分割结果

    // 判断子串 s[left:right] 是否是回文
    bool isPalindrome(const string& s, int left, int right)
    {
        // 左右双指针向中间收缩比较
        for (int i = left, j = right; i < j; i++, j--)
        {
            // 如果发现不相等的字符,则不是回文
            if (s[i] != s[j])
            {
                return false;
            }
        }
        // 如果所有字符都相等,则是回文
        return true;
    }

    // 回溯函数,用于生成所有可能的回文分割
    void backtracing(string s, int index)
    {
        // 如果遍历到字符串的末尾,说明找到了一种分割方式
        if (index >= s.size())
        {
            result.push_back(res); // 将当前路径加入结果集
            return;
        }
        // 从当前索引开始,遍历字符串
        for (int i = index; i < s.size(); i++)
        {
            // 如果 s[index:i] 是回文
            if (isPalindrome(s, index, i))
            {
                // 将当前回文子串加入路径
                string str = s.substr(index, i - index + 1);
                res.push_back(str);

                // 递归处理子串 s[i+1:end]
                backtracing(s, i + 1);

                // 回溯,移除当前回文子串
                res.pop_back();
            }
            else
            {
                // 如果不是回文,继续检查下一个子串
                continue;
            }
        }
    }

    // 主函数,初始化回溯并返回结果
    vector<vector<string>> partition(string s)
    {
        backtracing(s, 0); // 从索引 0 开始进行回溯
        return result; // 返回所有可能的回文分割
    }
};
  • 初始化输入字符串 s = "aab"
  • 调用 partition 函数,该函数开始回溯。
  • backtracing 函数中,从索引 0 开始遍历:
    • 第一次循环:
      • i = 0: 检查子串 s[0:0]("a"),是回文,将其加入当前路径 res = ["a"]
      • 递归调用 backtracing,索引增加到 1
    • 第二次循环:
      • i = 1: 检查子串 s[1:1]("a"),是回文,将其加入当前路径 res = ["a", "a"]
      • 递归调用 backtracing,索引增加到 2
    • 第三次循环:
      • i = 2: 检查子串 s[2:2]("b"),是回文,将其加入当前路径 res = ["a", "a", "b"]
      • 递归调用 backtracing,索引增加到 3,等于字符串长度,当前路径 res 被加入结果集。
  • 回溯到上一个递归层次,移除当前路径的最后一个元素,继续循环检查其他子串。
  • 通过循环和递归的方式,最终找到所有可能的回文分割,并将其加入结果集。
相关推荐
AC赳赳老秦1 分钟前
2026 智能制造趋势:DeepSeek 助力“黑灯”工厂运营,实现生产流程自动化
网络·数据结构·算法·安全·web安全·prometheus·deepseek
流云鹤5 分钟前
2026牛客寒假算法基础集训营6(K H G B A)
算法
程序员酥皮蛋7 分钟前
hot 100 第三十题 30. 两两交换链表中的节点
数据结构·算法·leetcode·链表
寻寻觅觅☆8 分钟前
东华OJ-基础题-131-8皇后·改(C++)
c++·算法·深度优先
踩坑记录14 分钟前
leetcode hot100 207. 课程表 检测有向图中是否存在环 medium Kahn 算法 入度表 BFS 图论
leetcode·宽度优先
程序员徐师兄16 分钟前
基于 Python 深度学习的电影评论情感分析算法
python·深度学习·算法·电影情感分析算法·评论情感分析
零售ERP菜鸟28 分钟前
数据驱动:从经验主义的“后视镜”到科学决策的“导航仪”
大数据·人工智能·职场和发展·创业创新·学习方法·业界资讯
ShineWinsu30 分钟前
对于C++中list的详细介绍
开发语言·数据结构·c++·算法·面试·stl·list
_OP_CHEN30 分钟前
【算法提高篇】(三)线段树之维护更多的信息:从基础到进阶的灵活运用
算法·蓝桥杯·线段树·c/c++·区间查询·acm/icpc·信息维护
mjhcsp31 分钟前
C++Lyndon 分解超详解析
c++·算法·lyndon