题目描述
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
含义:
指定字符串 s,返回 s 所有可能的子串,每个子串必须是一个回文(指顺读和倒读都一样的字符串).
For example, given s ="aab",
Return
[
["aa","b"],
["a","a","b"]
]
实现代码:
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<string> sln; //一维容器,元素为string类型;
vector<vector<string> > result; //二维容器,元素为vector类型;
find_partition_sln(s, sln, result);
return result;
}
// 检查一个字符串是否为回文
bool check_palindrome(string s)
{
int size = s.size();
for (int i = 0; i < size/2; i ++)
{
if (s[i] != s[size - i - 1]) //两边的索引值相加即为字符串长度size;
{
return false;
}
}
return true;
}
void find_partition_sln(string s, vector<string> &sln, vector<vector<string> > &result)
{
// 边界结束条件
if (s.size() == 0)
{
// 能到这,说明找到了一个可能的解,前面的子串都是符合条件的
result.push_back(sln);
}
int size = s.size();
// 把字符串从第一个位置到最后一个位置,依次进行分隔
// 并在每一种情况下,利用深度搜索找到合适的解
for (int i = 1; i <= size; i ++)
{
string front;
string remain;
front.assign(s, 0, i); //string &assign(const string &s,int start,int n);
remain.assign(s, i, size - i); //把字符串s中从start开始的n个字符赋给当前字符串
if (check_palindrome(front)) //只有检测到front是回文时,才会继续划分;
{
// front符合条件
sln.push_back(front);
// 寻找以front开头的可行解,深度优先
find_partition_sln(remain, sln, result);
// 重新开始下一个查找
sln.pop_back();
}
}
}
};