132. Palindrome Partitioning II (动态规划)

来源:互联网 发布:jasper陈小春知乎 编辑:程序博客网 时间:2024/06/05 20:22

刷题地址

https://leetcode.com/problems/palindrome-partitioning-ii/#/description

AC

思路详解
http://blog.csdn.net/jin_kwok/article/details/51423222

  1. 超时代码:
class Solution {public:    bool isPalindrome(string s, int sta, int en)    {        int i = sta;        int j = en;        while(i < j)        {            if(s[i] != s[j])                return false;            i ++;            j --;        }        return true;    }    int minCut(string s) {        int len = s.size();        vector<vector<int>> dp(len,vector<int>(len,0));        for(int i=0;i<len;i++)        {            dp[i][i] = 1;            for(int j = i + 1 ; j < len;j++)            {                if(isPalindrome(s,i,j))                    dp[i][j] = 1;            }        }        vector<int> cnt(len + 1, 0);        cnt[len] = -1;        cnt[len-1] = 0;        for(int i=len-2; i>=0; i--)        {            cnt[i] = 1 + cnt[i+1];            for(int j = i+1;j < len;j++)            {                   if(dp[i][j] == 1)                {                    cnt[i] = min(cnt[i], 1 + cnt[j+1]);                }            }        }        return cnt[0];    }};

2.ac代码

class Solution {public:    int minCut(string s) {        int len = s.size();        vector<vector<int>> dp(len,vector<int>(len,0));        vector<int> cnt(len + 1, 0);        cnt[len] = -1;        for(int i=len-1; i>=0; i--)        {            cnt[i] = 1 + cnt[i+1];            for(int j = i;j < len;j++)            {                   // s[i-j]的回文判断                if(s[i] == s[j] && (j-i<=1 ||dp[i+1][j-1] == 1) )                {                    dp[i][j] = 1;                    cnt[i] = min(cnt[i], 1 + cnt[j+1]);                }            }        }        return cnt[0];    }};
原创粉丝点击