码迷,mamicode.com
首页 > 其他好文 > 详细

Palindrome Partitioning II -- leetcode

时间:2015-05-27 17:29:29      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:palindrome   回文   leetcode   

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.


将一个字符串分隔成子串,每个子串都是回文。

要求,返回最小的分隔数。

基本思路:

动态规划。

用一个数组,cut[i], 表示第i位以前的字符串,最小的分隔数。

设下标 i, j, i<j,    如果s[i,j]子串为一个回文,则 cut[j+1] = min(cut[j+1], cut[i]+1)。 


采用中心扩张法,逐步扩大回文子串的范围。

即对每一个字符,以该字符为中心,如果两边字符相等,则为一个回文;由此往外逐步扩张,直到不等为止。

对每找到一个回文,应用cut[j+1] = min(cut[j+1], cut[i]+1) 更新cut数组。

注意中心扩张法,分成两种方式,一是奇扩张,即以该字符为中心。

二是偶扩张,以该字符和该字符前面的一个字符,整体作为中心,进行扩张。


在leetcode上实际执行时间为12ms。

class Solution {
public:
    int minCut(string s) {
        vector<int> cut(s.size()+1, s.size()-1);
        cut[0] = -1;
        for (int i=0; i<s.size(); i++) {
            for (int j=0; i-j>=0 && i+j<s.size() && s[i-j] == s[i+j]; j++) {
                cut[i+j+1] = min(cut[i+j+1], cut[i-j]+1);
            }
            for (int j=0; i-j-1>=0 && i+j<s.size() && s[i-j-1] == s[i+j]; j++) {
                cut[i+j+1] = min(cut[i+j+1], cut[i-j-1]+1);
            }
        }
        return cut[s.size()];
    }
};


该算法思路来源:

https://leetcode.com/discuss/9476/solution-does-not-need-table-palindrome-right-uses-only-space

在偶扩张时,与原代码略有不同。并在数组初始化略略作了改进。去掉了一个循环。

只用 cut[0] = -1。


Palindrome Partitioning II -- leetcode

标签:palindrome   回文   leetcode   

原文地址:http://blog.csdn.net/elton_xiao/article/details/46047791

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!