提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
找出最长回文子串
一、思路是什么?
判断回文子串+找到最长子串—>暴力枚举
暴力枚举发要找出所有子串并依次判断是否为回文字符串,
再比较出最长的回文子串长度,进而找到对应的最长回文子串
(然而本人在按顺序写代码的时候卡住了,比较并找对应子串这部分没写明白)——于是进行了思路的优化,让代码逻辑上简单一点
二、代码思路优化
判断回文子串+找到最长子串—>暴力枚举(不完全)
用找中心元素的方式直接找回文子串(不是回文的直接放弃)
通过循环递增中心元素的下标,直接找出最长的回文子串,覆盖掉之前找出的短的子串
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),希望大家继续深入思考找出更优解法。还有很多种方式也可以达到同样的目的,希望大家继续探索。