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;
    // }
};
相关推荐
少许极端2 小时前
算法奇妙屋(十四)-简单多状态dp问题
算法·动态规划·图解算法·简单多状态dp·打家劫舍问题·买卖股票问题全解
稚辉君.MCA_P8_Java4 小时前
Gemini永久会员 Go 实现动态规划
数据结构·后端·算法·golang·动态规划
smj2302_7968265211 小时前
解决leetcode第3753题范围内总波动值II
python·算法·leetcode
leoufung14 小时前
LeetCode 92 反转链表 II 全流程详解
算法·leetcode·链表
利刃大大15 小时前
【动态规划:背包问题】完全平方数
c++·算法·动态规划·背包问题·完全背包
im_AMBER16 小时前
Leetcode 59 二分搜索
数据结构·笔记·学习·算法·leetcode
leoufung16 小时前
LeetCode 61. 旋转链表(Rotate List)题解与思路详解
leetcode·链表·list
leoufung21 小时前
逆波兰表达式 LeetCode 题解及相关思路笔记
linux·笔记·leetcode
Aspect of twilight1 天前
LeetCode华为大模型岗刷题
python·leetcode·华为·力扣·算法题
2301_807997381 天前
代码随想录-day47
数据结构·c++·算法·leetcode