Palindrome Partitioning II

题目:Given a string s, partition s such that every substring of the partition is a palindrome.

Return the minimum cuts needed for a palindrome partitioning of s.For example, given s = "aab",

Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.

思路:

本题使用动态规划,一开始使用dp[i][j]二维数组代表从i到j能否形成回文串,这里面有一些小技巧比如:如果dp[i][j]是真的话,那么dp[i+1][j-1]也是真之类的。

当然,首先,count[i]=min{  count[i],count[j+1]+1    }&&dp[i][j]==1  这个核心的条件。

在最后的代码里面,最终判断的时候就一个判断句。

代码:

class Solution {
public:
//https://leetcode.com/problems/palindrome-partitioning-ii/
    int minCut(string s) {
        //核心公式
        //  count[i]=从i到尾的最小剪切数
        //  count[i]=min{  count[j+1]+1  }  +  dp[i][j]==1   j=i....s.length()        
        int len = s.size();  
        int count[len+1];
        bool dp[len][len];     

        for(int i = 0; i <= len; i++){
            count[i] = len-i;     
        }   

        for(int i = 0; i < len; i++){
            for(int j = 0; j < len; j++){
                dp[i][j] = false;     
            }   
        }  

        for(int i=len-1;i>=0;i--){

            for(int j=i;j<=len-1;j++){
                if((j-i<2||dp[i+1][j-1]==1)&& s[i]==s[j]){
                    dp[i][j]=true;
                    count[i]=min(   count[i],count[j+1]+1    );
                }
            }
        }

        return count[0]-1;
    }
};


posted @ 2015-10-21 22:08  JSRGFJZ6  阅读(128)  评论(0编辑  收藏  举报