leetcode 131. Palindrome Partitioning

目录

一、题目描述

二、方法1、回溯法+每次暴力判断回文子串

三、方法2、动态规划+回溯法


一、题目描述

分割回文子串

131. Palindrome Partitioning

二、方法1、回溯法+每次暴力判断回文子串

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

    void backtracking(string &s,int start){
        if(start == s.size()){
            res.push_back(path);
            return;
        }

        for(int i = start;i < s.size();i++){
            string cur = s.substr(start,i-start+1);
            if(!isPalindrome(cur))
                continue;
            path.push_back(cur);
            backtracking(s,i+1);
            path.pop_back();
        }
    }

    bool isPalindrome(const string &str){
        int left = 0;
        int right = str.size()-1;
        while(left<=right){
            if(str[left]!= str[right])
                return false;
            left++;
            right--;
        }
        return true;
    }
};

三、方法2、动态规划+回溯法

先用动态规划法,求出s[i,j]是否是回文子串,后面直接查表判断回文子串。

参考leetcode 647. Palindromic Substrings-CSDN博客

cpp 复制代码
class Solution {
    vector<vector<string>> res;
    vector<string> path;
    vector<vector<bool>> dp;
public:
    vector<vector<string>> partition(string s) {
        int n = s.size();
        //0 <= i<=j <= n-1
        //dp[i][j]表示s[i,j]是否是回文子串,其中i<=j,i>j的dp[i][j]不定义
        dp.resize(n,vector<bool>(n,false));
        for(int i = n-1;i>=0;i--){
            for(int j = i;j<n;j++){
                if(s[i] == s[j]){
                    if(j-i <= 1){
                        dp[i][j] = true;
                    }else if(dp[i+1][j-1] == true){
                        dp[i][j] = true;
                    }
                }
            }
        }

        backtracking(s,0);
        return res;
    }

    void backtracking(string &s,int start){
        if(start == s.size()){
            res.push_back(path);
            return;
        }

        for(int i = start;i < s.size();i++){
            string cur = s.substr(start,i-start+1);
            // if(!isPalindrome(cur))
            //     continue;
            if(!dp[start][i])
                continue;
            path.push_back(cur);
            backtracking(s,i+1);
            path.pop_back();
        }
    }

    // bool isPalindrome(const string &str){
    //     int left = 0;
    //     int right = str.size()-1;
    //     while(left<=right){
    //         if(str[left]!= str[right])
    //             return false;
    //         left++;
    //         right--;
    //     }
    //     return true;
    // }
};
相关推荐
csdn_aspnet3 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯
python·算法·leetcode·职场和发展
m0_629494736 小时前
LeetCode 热题 100-----26.环形链表 II
数据结构·算法·leetcode·链表
Shan12057 小时前
什么是换根DP及第一步操作说明
动态规划
阿文的代码库9 小时前
换根技巧实例分析:最小高度树
算法·动态规划
不知名的老吴9 小时前
浅谈:树形动态规划中的换根技巧
算法·动态规划
小羊在睡觉11 小时前
力扣239. 滑动窗口最大值
数据结构·后端·算法·leetcode·go
大大杰哥11 小时前
leetcode hot100(4)矩阵
算法·leetcode·矩阵
叶小鸡12 小时前
小鸡玩算法-力扣HOT100-动态规划(上)
算法·leetcode·动态规划
凌波粒12 小时前
LeetCode--513.找树左下角的值(二叉树)
java·算法·leetcode
_F_y13 小时前
树形 DP 从入门到进阶:普通树形DP、树形背包、换根DP
c++·动态规划