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、动态规划+回溯法

先用动态规划法,求出si,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;
    // }
};
相关推荐
richard_yuu14 小时前
动态规划:强化学习的「数学基础」,从 MDP 到值迭代
深度学习·神经网络·算法·yolo·机器学习·动态规划
Persistent的粽子!15 小时前
双指针算法:最大盛水容器
c++·算法·leetcode
All for pursuit.21 小时前
【二叉树-10】114.二叉树展开为链表
数据结构·c++·算法·leetcode·链表
lvwangshu1 天前
P12960 毒药 题解
动态规划·题解·贪心·技巧·性质题·思维好题
旖旎夜光7 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
CoderYanger7 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
圣保罗的大教堂7 天前
leetcode 3524. 求出数组的 X 值 I 中等
leetcode
Tim_107 天前
【LeetCode】338、比特位计数
c++·算法·leetcode
mmmmath_37 天前
LeetCode.028.找出字符串中第一个匹配项的
数据结构·算法·leetcode
Navigator_Z7 天前
LeetCode //C - 1255. Maximum Score Words Formed by Letters
c语言·算法·leetcode