2道寻找回文子串的题目

题目

题目1

题目2
image

题目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);
		}
	}
}

作者:XTG111

出处:https://www.cnblogs.com/XTG111/p/18235214

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   XTG111  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示