题目
题目1
题目2
题目1是将字符串分隔,使得分隔后得到的每个字符串都是回文子串
题目2是从字符串里面找到回文子串
两道题都可以利用递归来解决
//利用双指针判断是否是回文子串
bool isre(string& s)
{
int left = 0;
int right - s.size()-1;
while(left <= right)
{
if(s[left]!=s[right]) return false;
}
return true;
}
题目1解法
除了递归还需要使用回溯,即采用深度搜索,将一次寻找结束后,将倒退,修改分割方法继续寻找匹配
//两个数组,一个存储最终结果,一个存储一次遍历的结果
vector<vector<string>> res;
vector<string> path;
//k是每次搜索的起始位置
void getRes(string& s,int k)
{
//当起始位置到达末尾,将path结果添加到res数组中
if(k == s.size())
{
res.push_back(res);
return;
}
//从第K个位置开始计算字符串
for(int i = k;i<s.size();i++)
{
string check = s.substr(k,i-k+1);
if(isre(check))
{
path.push_back(check);
//对之后的字符串进行分割
getRes(s,i+1);
//这轮字符串搜索完之后,回溯
path.pop_back();
}
}
}
题目2
需要注意的就是处理重复的情况,比如一个字符串全是a的情况。
当寻找到一个回文子串就可以将其添加到结果数组中
vector<string> res;
unordered_set<string> path; // 用来避免重复
void getRes(string& s, int k)
{
if(k == s.size()) return; //遍历完字符串,说明寻找完了
for(int i = k;i<s.size();i++)
{
string check = s.substr(k,i-k+1);
if(isre(check) && path.find(check) == path.end())
{
res.push_back(check);
path.emplace(check);
//从k+1开始搜索下一个回文子串
getRes(s,k+1);
}
}
}
标签:子串,题目,int,res,字符串,回文
From: https://www.cnblogs.com/XTG111/p/18235214