Palindrome Partitioning II

来源:互联网 发布:阿里云基础服务平台图 编辑:程序博客网 时间:2024/06/08 18:59

题目

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.

思路一

用递归得到所有可能的划分,可以参考上篇博文Palindrome Partitioning,然后求取最短的划分。

但是我们没必要存取所有的划分结果,只需要存储划分段数就可以了。

对空间的改进

class Solution {public:    int minCut(string s) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        int len = s.length();           if(len<1) return 0;        vector<string> vec;        int min = INT_MAX;         mypart(vec, 0, s, min);             return min-1;    }     void mypart(vector<string> &vec, int cur, string &S, int &min) {         if(cur==S.length()) {             if(vec.size()<min)                 min = vec.size();             return ;         }         for(int i=cur;i<S.length();i++) {             int len = i-cur+1;             string str = S.substr(cur,len);             if(ispalind(str)) {                 vec.push_back(str);                 mypart(vec, i+1, S, min);                 vec.pop_back();             }         }              }            bool ispalind(string &S) {         if(S.empty())               return true;         int i=0, j=S.length()-1;         while(i<j) {             if(S[i]!=S[j])                 return false;             i++;             j--;         }             return true;     }       };

对大数据虽然没有内存限制了,但是还是出现了 Run Status: Time Limit Exceeded

因为我们还可以进一步的 剪枝优化 步的:如果当前子字符串生成的回文划分段数已经超过了 min ,就没必要接着进行下去了。

剪枝优化时间

         for(int i=cur;i<S.length();i++) {             int len = i-cur+1;             string str = S.substr(cur,len);             if(vec.size()<=min && ispalind(str)) {                 vec.push_back(str);                 mypart(vec, i+1, S, min);                 vec.pop_back();             }         } 

或者

         if(vec.size()+1>min)             return ;         for(int i=cur;i<S.length();i++) {             int len = i-cur+1;             string str = S.substr(cur,len);             if(ispalind(str)) {                 vec.push_back(str);                 mypart(vec, i+1, S, min);                 vec.pop_back();             }         } 

但好像都还是未能通过大数据。

原因是 虽然加入剪枝,但是算法的基本思想还是遍历,数量级未改变,依旧是 O(N*N) 。

下面考虑要降低数量级了。

思路二

用DP动态规划的思想:

二维标志数组 ispalin[i][j] 记录 s 的 i~j 子串是否是回文的;

一维数组 num[i] 记录 s 的 i~len-1 分割后的最小段数,初始化时 num[0]=len, ... , num[len-1]=1;

最优结果是 num[0]-1 。

动态规划过程:

(1)如果s[i]=s[j] 并且 ispalin[i+1][j-1]=true ,则表示 i~j 也是回文,即  ispalin[i][j]=true。

(2)如果s[i]=s[j] 并且 ispalin[i][j]=true,则 num[i] = min(num[i], num[j+1]+1) ,即更新当前 i~len-1子串的最小段数。

class Solution {public:    int minCut(string s) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        int len = s.length();        if(len<2)  return 0;        vector<vector<bool>> ispalin(len,vector<bool>(len,false));        vector<int> num(len+1,0);        for(int i=0;i<len;i++)            num[i] = len-i;        for(int i=len-1;i>=0;i--) {            for(int j=i;j<len;j++) {                if(s[i]==s[j]) {                    if(j-i<2) {                        ispalin[i][j]=true;                        num[i] = min(num[i],num[j+1]+1);                    }else if(ispalin[i+1][j-1]) {                        ispalin[i][j]=true;                        num[i] = min(num[i],num[j+1]+1);                    }                                    }            }          }           return num[0]-1;            }};

其实时间复杂度也是 O(N*N)的,但是对大数据轻松通过了。

与思路一比较:

优点在,对当前的子串是否是回文的判断上要更优,避免重复判断。

例如:如果 s1=abba 是回文,当增加长度时 s2=dabbad ,

思路一:再遍历一遍 s2 ,时间 O(length(s2))

思路二:比较新增加的字符是否相等,同时判断s1是否是回文,时间O(2+1)

所以高下优劣立见。

如果仔细分析计算:

(1)思路一的时间复杂度是 O(N*N*length(str))

(2)DP的时间复杂度是 O(N*N*2)


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 找不到旧版本米聊怎么办 苹果id被锁了怎么办 新浪微博支付宝解绑失败怎么办 阿里妈妈升级看不到引流人数怎么办 阿里妈妈账号被冻结怎么办 微博昵称到次数怎么办 五星好评之后忘记截图了怎么办 评价后忘了截图怎么办 好评率太低不能买东西了怎么办 淘宝评价被删了怎么办 淘宝店铺有流量没有成交怎么办 淘宝好评被删了怎么办 淘宝评论被系统删除怎么办 淘宝被商家删除评价怎么办 淘宝评价管理商家删除了怎么办 淘宝商家删除评价我该怎么办 我的评价隐藏了怎么办 淘宝把评论删了怎么办 淘宝虚假交易被删除评价怎么办 淘宝好评评错了怎么办 被淘宝骗了好评怎么办 美团好评被删了怎么办 卖家收到好评内容是差评怎么办 淘宝收货电话写错了怎么办 淘宝评价写错了怎么办 饿了么商家差评怎么办 淘宝不给补差价怎么办 淘宝顾客给差评怎么办 淘宝买家账号体检违规怎么办 买家淘宝账户体检中心违规怎么办 淘宝卖家电话骚扰该怎么办 手机欠费销户了怎么办 想下载好多个淘宝怎么办 送快递不记得路怎么办 淘宝物流弄丢了怎么办 邮政快递碰上难缠客户怎么办 举证工伤对方不签收怎么办 快递员收件的钱怎么办 锐捷网卡是空的怎么办 mac系统excel太慢怎么办 二手车交易发票丢了怎么办