题目描述
思路
这道题与leetcode 300 最长上升子序列 简单易懂 动态规划解法 O(n^2) 思路一致 解法一致
都是子序列+剪枝问题。
遇到这类问题首先思考,是否是排列组合问题。然后写出全排列组合写法。
运用串s的长度来判断是否排列完,然后进行组合。
代码
class Solution {
public:
//存储最终结果
vector<vector<string>> res;
//存储组合结果
vector<string> myStr;
void dfs(string s)
{
if(s.empty())
{
res.push_back(myStr);
return;
}
for(int i=1;i<=s.size();i++)
{
string temp = s.substr(0,i);
//剪枝
if(valid(temp))
{
myStr.push_back(temp);
dfs(s.substr(i,s.length()-i));
//回溯
myStr.pop_back();
}
}
}
bool valid(const string& temp)
{
if(temp.length()==1)
return true;
for(int i=0,j=temp.length()-1;i<j;i++,j--)
{
if(temp[i]!=temp[j])
return false;
}
return true;
}
vector<vector<string>> partition(string s) {
dfs(s);
return res;
}
};
重难点分析
回文串判断,首位指针。
递归终止条件,以及字符串substr操作,取末位数目
重点i的值为1开始,小于等于末位