qingcheng奕  

https://oj.leetcode.com/problems/palindrome-partitioning-ii/

给定一个串,让把它划分成子串,要求每个子串都是回文的。

动态规划:

设数组 ans(i)表示从0到 i 要经过的最小划分数,则

ans[i] = ans[k] + 1,如果 k 到 i 是回文的

            i - 1       ,如果 k 到 i 都不是回文的

class Solution{
public:
    int minCut(string s)
    {
        const int n = s.size();
        vector<int> ans;
        ans.resize(n+1);
        vector<vector<bool> > isPal;
        isPal.resize(n);
        for(int i = 0;i<n;i++)
            isPal[i].resize(n);

        for(int i = 0;i<=n;i++)
        {
            ans[i] = n - 1 - i;
        }

        for(int i = n-1;i>=0;i--)
            for(int j = i; j<n;j++)
            {
                if(s[i] == s[j] &&(j-i<2 || isPal[i+1][j-1]))
                {
                    isPal[i][j] = true;
                    ans[i] = min(ans[i],ans[j+1]+1);
                }
            }
        return ans[0];
    }
};

 

 

posted on 2014-07-04 09:12  qingcheng奕  阅读(128)  评论(0编辑  收藏  举报