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;
    // }
};
相关推荐
刃神太酷啦3 小时前
C++ 容器适配器与核心数据结构精解:栈、队列、deque 底层实现与实战应用----《Hello C++ Wrold!》(17)--(C/C++)
java·c语言·数据结构·c++·qt·算法·leetcode
是店小二呀4 小时前
【动态规划 | 子序列问题】子序列问题的最优解:动态规划方法详解
算法·动态规划·代理模式
AWEN_335 小时前
最大重复子字符串
leetcode
ikkkkkkkl6 小时前
LeetCode:209.长度最小的子数组&&3.无重复字符的最长子串
数据结构·c++·算法·leetcode
桦06 小时前
[找出字符串中第一个匹配项的下标]
算法·leetcode
恣艺6 小时前
LeetCode 140:单词拆分 II
算法·leetcode·职场和发展
恣艺9 小时前
LeetCode 132:分割回文串 II
算法·leetcode·代理模式
葵续浅笑11 小时前
LeetCode - 合并两个有序链表 / 删除链表的倒数第 N 个结点
java·算法·leetcode
weisian15117 小时前
力扣经典算法篇-41-旋转图像(辅助数组法,原地旋转法)
算法·leetcode·职场和发展
weisian15118 小时前
力扣经典算法篇-38-组合(回溯算法)
算法·leetcode·职场和发展