C#查找最长回文子串

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

找出最长回文子串

一、思路是什么?

判断回文子串+找到最长子串—>暴力枚举
暴力枚举发要找出所有子串并依次判断是否为回文字符串,
再比较出最长的回文子串长度,进而找到对应的最长回文子串

(然而本人在按顺序写代码的时候卡住了,比较并找对应子串这部分没写明白)——于是进行了思路的优化,让代码逻辑上简单一点

二、代码思路优化

判断回文子串+找到最长子串—>暴力枚举(不完全)
用找中心元素的方式直接找回文子串(不是回文的直接放弃)
通过循环递增中心元素的下标,直接找出最长的回文子串,覆盖掉之前找出的短的子串

1.直接上代码

代码如下(示例):

char* answer(char* s)
{
	int len = strlen(s);
	int left, right, med;
	
	int anslen = 0, sta = 0; //anslen为回文长度 sra为回文的起始下标 
	
	for (med = 0; med < len; med++)//这样采用循环的方式是因为要找出最长的回文数组,所以短的回文直接覆盖掉 
	{
		left = med - 1;
		right = med + 1;
		while (left >= 0 && right < len && s[left] == s[right])
		{
			left--;
			right++;
		}
		if ((right - left - 1) > anslen)//用新子串两头下标的差和上一个回文子串的长度作比较 
		{
			sta = left + 1;
			anslen = right - left - 1;
		}
	}
	//奇数回文 (把每个元素当成中心,看他上下两边的元素是否相同,计数) 
	for (med = 0; med < len; med++)
	{
		left = med;
		right = med + 1;
		while (left >= 0 && right < len && s[left] == s[right])
		{
			left--;
			right++;
		}
		if ((right - left - 1) > anslen)//与之前找到的字符串比长度 
		{
			sta = left + 1;
			anslen = right - left - 1;
		}
		//偶数回文 (以相邻相等的两个元素为中心向两边扩展,判断元素是否相同,计数) 
	}
	s[sta + anslen] = '\0';//注意在原数组中插入\0,返回后输出指定回文子串 
	return s + sta;
}

三、总结

以上就是今天要讲的内容,本文仅仅简单介绍了一种查找最长回文子串的C#写法,美中不足的是他破坏了原有字符串(在中间加上了\0),希望大家继续深入思考找出更优解法。还有很多种方式也可以达到同样的目的,希望大家继续探索。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值