LintCode-分割回文串 II
2015-08-09 14:34
246 查看
给定一个字符串s,将s分割成一些子串,使每个子串都是回文。
返回s符合要求的的最少分割次数。
您在真实的面试中是否遇到过这个题?
Yes
样例
比如,给出字符串s = "aab",
返回 1, 因为进行一次分割可以将字符串s分割成["aa","b"]这样两个回文子串
标签 Expand
相关题目 Expand
分析:一开始写了个n的三次的dp,结果超时,差不多是dp[i][j] = min(dp[i][k]+dp[k+1][j]+1)的思想,那么肯定要把它优化到n平方的dp,于是联想到word break那题,如果s[i][j]是回文串的话,就可以dp[j] = dp[i-1]+1了,从二维dp简化到一维dp,从而降低了复杂度
代码:
返回s符合要求的的最少分割次数。
您在真实的面试中是否遇到过这个题?
Yes
样例
比如,给出字符串s = "aab",
返回 1, 因为进行一次分割可以将字符串s分割成["aa","b"]这样两个回文子串
标签 Expand
相关题目 Expand
分析:一开始写了个n的三次的dp,结果超时,差不多是dp[i][j] = min(dp[i][k]+dp[k+1][j]+1)的思想,那么肯定要把它优化到n平方的dp,于是联想到word break那题,如果s[i][j]是回文串的话,就可以dp[j] = dp[i-1]+1了,从二维dp简化到一维dp,从而降低了复杂度
代码:
class Solution { public: /** * @param s a string * @return an integer */ int minCut(string s) { // write your code here int n = s.length(); vector<vector<bool> > dp1(n,vector<bool>(n,false)); for(int len = 1;len<=n;len++) { for(int i=0;i+len-1<n;i++) { int j = i+len-1; if(len==1) { dp1[i][j]=true; } else { if(s[i]==s[j]&&(i==j-1||dp1[i+1][j-1])) dp1[i][j] = true; } } } vector<int > dp2(n,INT_MAX); for(int i=0;i<n;i++) { if(dp1[0][i]) dp2[i] = 0; for(int j=0;j<i;j++) { if(dp1[j+1][i]) dp2[i] = min(dp2[i],dp2[j]+1); } } return dp2[n-1]; } };
相关文章推荐
- 博客开通了
- 解决Django使用MySQL报模块找不到的错误
- 通知和代理
- 第21章 动态链接库和钩子(1)
- 你感觉到运维的耻辱感了吗?
- 倒计时
- Objective-C学习笔记_NSString、NSArray、NSNumber
- Git客户端工具GitExtensions安装
- js获取时间及倒计时
- linux 信号signal和sigaction理解
- C++ 模板详解(二)
- webshell防范的一点笔记
- python中的模块以及package的小结
- Mysql那些琐碎
- uva 10405 Longest Common Subsequence(最长公共子序列)
- C++ 模板详解(一)
- 拉伸关键维度,发现设计中的不足
- OSS简介
- FTPClient.listFiles() 放到linux上,返回值为null或数组长度为0
- App Transport Security has blocked a cleartext HTTP 解决办法