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;
    // }
};
相关推荐
琢磨先生David5 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
超级大福宝5 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
Charlie_lll5 天前
力扣解题-88. 合并两个有序数组
后端·算法·leetcode
菜鸡儿齐5 天前
leetcode-最小栈
java·算法·leetcode
zephyr055 天前
DP 从放弃到拿捏:一份持续更新的动态规划题解清单(一)
算法·动态规划
Frostnova丶5 天前
LeetCode 1356. 根据数字二进制下1的数目排序
数据结构·算法·leetcode
mjhcsp5 天前
C++轮廓线 DP:从原理到实战的深度解析
开发语言·c++·动态规划
.格子衫.5 天前
031动态规划之数位DP——算法备赛
算法·动态规划
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
样例过了就是过了5 天前
LeetCode热题100 环形链表 II
数据结构·算法·leetcode·链表