leetcode 132 分割回文串II

简介: leetcode 132 分割回文串II

分割回文串II

动态+递归(超时)

class Solution {
public:
    int result_num = INT_MAX;
    void trak_back(vector<vector<bool>> &dp , int indnx ,int result)
    {
        if(indnx == dp[0].size())
        {
            if(result_num > result) result_num = result;
            return;
        }
        for(int i=0 ; i<dp[0].size() ;i++)
        {
            if(dp[indnx][i] == true )
            {
                trak_back(dp,i+1,result+1);
            }
        }
    }
    int minCut(string s) {
        int result =0;
        vector<vector<bool>> dp(s.size() , vector<bool>(s.size(),false));
        for(int i=s.size()-1 ; i>=0 ;i--)
        {
            for(int j=i ; j<s.size() ;j++)
            {
                if(s[i]==s[j] && ( j-i<=1|| dp[i+1][j-1] == true )) dp[i][j] = true;
            }
        }
        trak_back(dp,0,result);
        return result_num-1;
    }
};

双DP

class Solution {
public:
    int minCut(string s) {
        vector<vector<bool>> dp(s.size() , vector<bool>(s.size(),false)); //dp[i][j]为i到j内是否是回文子串
        for(int i=s.size()-1 ; i>=0 ;i--)
        {
            for(int j=i ; j<s.size() ;j++)
            {
                if(s[i]==s[j] && ( j-i<=1|| dp[i+1][j-1] == true )) dp[i][j] = true;
            }
        }
       vector<int> dp2(s.size() , 0); //dp2[i] 为i内最少可以分为几段
       for(int i=0 ; i<s.size() ;i++) dp2[i] = i+1;//初始化,最差的情况,一个字符一段
       for(int i=0 ; i<s.size() ;i++) 
       {
            if(dp[0][i] == true)  //如果0到i是一段,则不看0到i内部,直接dp2[i] = 1;
            {
                dp2[i] = 1;
                continue;
            }
            for(int j=0 ; j<i ;j++) //判断j+1 到 i是否是一段,如果是 在dp2[i] 和 dp[j]+1选最小
                if(dp[j+1][i] == true) dp2[i] = min(dp2[i] , dp2[j] + 1 );
       }
        return dp2[s.size()-1] - 1;
    }
};
相关文章
|
3月前
|
Python
【Leetcode刷题Python】416. 分割等和子集
LeetCode 416题 "分割等和子集" 的Python解决方案,使用动态规划算法判断是否可以将数组分割成两个元素和相等的子集。
30 1
|
3月前
|
Python
【Leetcode刷题Python】131. 分割回文串
LeetCode题目131的Python编程解决方案,题目要求将给定字符串分割成所有可能的子串,且每个子串都是回文串,并返回所有可能的分割方案。
21 2
|
5月前
|
存储 算法 数据可视化
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
|
5月前
|
存储 算法 数据可视化
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
|
5月前
力扣经典150题第二十五题:验证回文串
力扣经典150题第二十五题:验证回文串
35 0
|
6月前
力扣2578. 最小和分割
力扣2578. 最小和分割
|
5月前
|
canal 算法 数据可视化
LeetCode 125题:验证回文串
LeetCode 125题:验证回文串
|
5月前
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
|
5月前
|
存储 算法 Java
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
31 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行