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

Return all possible palindrome partitioning of s.

For example, given s = "aab",
Return

  [
["aa","b"],
["a","a","b"]
]

思路:

回溯,但是不是常规回溯,因为解向量大小不定,需要动态判断。 下面是我写的代码, 只用了19ms 非常快, 自己挺满意的。

感受:之前做过DP求最少切几刀令所有部分都是回文,跟这个有点像。 觉得凡是求最的都是用DP,凡是求所有解的都是用回溯。

class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> ans;
if(s.empty())
return ans; vector<vector<bool>> isPalindrome(s.length(), vector<bool>(s.length(), false));
vector<vector<int>> S(s.length(), vector<int>(, )); //每个深度候选范围 用下标范围来记录
int k = ;
vector<string> X; while(k >= )
{
while(k >= && S[k][] < s.length()) //当前深度判断完毕 通过当前范围结束下标到达s的最后
{
int i = S[k][]; //当前深度判断位置的起始下标
int j = S[k][]; //当前深度判断位置的结束下标
if(s[i] == s[j] && (j - i < || isPalindrome[i+][j - ])) //分次判断是否为回文,每次使用历史信息
{
isPalindrome[i][j] = true;
while(X.size() >= k + ) //X长度不固定,所以用的时候会有上一次求解的值,我们需要把多出的部分弹出 !!特别注意
{
X.pop_back();
}
X.push_back(s.substr(i, j - i + ));
S[k][]++;
if(S[k][] < s.length())
{
k++;
S[k][] = S[k - ][];
S[k][] = S[k - ][];
}
else
{
ans.push_back(X);
}
}
else
{
S[k][]++;
}
}
k--;
}
return ans;
}
};

随机推荐

  1. android 读取SQLite android could not open the database in read/write mode错误

    由于AndroidManifest.xml文件中uses-permission没有设置权限问题 <uses-permission android:name="android.permi ...

  2. 关于SVN代码提交粒度和频率的思考

    今天组内新来的一个同事问我代码提交频率的问题,他在上家公司是一个模块功能开发自测完成后再提交.而我这边采用的是最少一天提交一次,提倡粒度较小的提交, 而且是基于主干开发.采用这种方式是出于以下几点考虑 ...

  3. 一段可以使用的 hibernate获得对象->action存入List->jsp页面用<s:iterator>迭代的代码

    SelectAction.java @SuppressWarnings("serial") @Component("selectAction") @Scope( ...

  4. 牡丹江.2014k(构造)

    K - Known Notation Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Su ...

  5. springMVC之国际化

    1.工程结构 2.jar包 3.配置文件spring-config.xml,springMVC配置文件 <?xml version="1.0" encoding=" ...

  6. 分享一个c#t的网页抓取类

    using System; using System.Collections.Generic; using System.Web; using System.Text; using System.Ne ...

  7. iOS开发——源代码管理——svn 命令行下常用的几个命令

    1.将文件checkout到本地目录    svn checkout path(path是服务器上的目录)    例如:svn checkout svn://192.168.1.1/pro/domai ...

  8. jbuilder的set!方法重构接口

    https://github.com/rails/jbuilder  的set!方法重构接口, 因为grape没法使用 jBuilder 的缓存,所以直接用 Rails 写 API (1)多个图片 i ...

  9. python 集合 -----直接用逗号连接的是元组,不是list

    t = 12345, 54321, 'hello!' >>> t[0] 12345 >>> t (12345, 54321, 'hello!') 元组:元组由逗号分 ...

  10. 清除SVN版本控制文件

    命名为bat后缀文件,放在对应目录下. @echo on color 2f mode con: cols=80 lines=25 @REM @echo 正在清理SVN文件,请稍候...... @rem ...