前言
一、题目
二、题解
2.0_思考
搞错题了,发现动态规不了一点
2.1_回溯法
这道题之前用回溯法做过
加了点注释直接贴过来
vector<vector<string>> ans; // 答案数组
vector<string> vec; // 用于遍历寻找答案
// 回文串判断函数
bool isPalindrome(string& s, int begin, int end) {
while (begin < end)
if (s[begin++] != s[end--])
return false;
return true;
}
// 回溯函数
void backtracking(string s,int startIndex) {
// 回溯条件-当起始点设为s.length()时,说明前面全部都判断为回文串了
if (startIndex >= s.length() ) {
ans.push_back(vec);
return;
}
// 进入下一层
// 因为起点不能重复,所以添加一个①回溯参数startIndex
for (int i = startIndex; i < s.length(); i++) {
// 判断索引范围是否为回文串
if (isPalindrome(s, startIndex, i))
// substr在string库中,第一个参数为截取的起始点,第二个参数为截取的长度
vec.push_back(s.substr(startIndex, i-startIndex+1)); // 是+1还是-1,随便举个例子试一下就行
else
continue; // 非回文串则跳过递归
backtracking(s, i + 1);
vec.pop_back();
}
}
// 回溯入口函数
vector<vector<string>> partition(string s) {
backtracking(s,0);
return ans;
}