暴力搜索寻找回文字符串(所有字符扫一遍),找到后用dfs做排列组合(这两步同时进行),空间复杂度时间复杂度双高,时间复杂度大概是O(n^2)
Palindrome Partitioning II 的解法与这道题大体相同,只不过为了节省时间,用了DP来找回文字符串,比上面提到的找回文方法好一些
class Solution {
public:
vector<vector<string> > partition(string s)
{
vector<vector<string> > result;
vector<string> list;
if (s.size() == 0)
return result;
calResult(result, list, s);
return result;
}
bool isPalindrome(string str)
{
int i = 0;
int j = str.size() - 1;
while (i < j)
{
if (str[i] != str[j])
{
return false;
}
i++;
j--;
}
return true;
}
void calResult(vector<vector<string> > &result, vector<string> list, string str)
{
//当处理到传入的字符串长度等于0,则这个集合list满足条件,加入到结果集中
if (str.length() == 0)
result.push_back(vector<string>(list));
int len = str.length();
//递归调用
//字符串由前往后,先判断str.substring(0, i)是否是回文字符串
//如果是的话,继续调用函数calResult,把str.substring(i)字符串传入做处理
for (int i = 1; i <= len; ++i)
{
string subStr = str.substr(0, i);
if (isPalindrome(subStr))
{
list.push_back(subStr);
string restSubStr = str.substr(i, str.size() - 1);
calResult(result, list, restSubStr);
list.pop_back();
}
}
}
};