算法练习----寻找最大回文子串

题目:

  寻找一个字符串中最大回文子串的长度。

 

解题思路:

   在我看了Asm竞赛题的答案后,发现有点难懂,所以自己开发了一个算法,并没有经过大规模数据测试,不能保证100%的通过率。

比如一个字符串为"12343215",这个时候我就以字符串的长度建立一个二维数组,而且列和行是一样长的。如下

 12343215
1        
2        
3        
4        
3        
2        
1        
5        

 

然后我们把行和列所代表的字符串,看成两个,然而这个时候,我们把两个字符串所对应的坐标点进行标注,如果相对应点字符相同,则将这个坐标点的值设为1,如果不是则为0。然后就变成了下面这让:

 12343215
110000010
201000100
300101000
400010000
300101000
201000100
110000010
500000001

然后,这个找回文子串的问题就转换为了,在这样一个二维数组中去,找从右上到左下方向最长的标注为1的对角线即可。 

 

解题代码:


/***********************************************
*
*参数:   原始字符串
*
*返回值: 最长回文子串长度
*
*时间:   2020/5/8
***********************************************/
int Solution::My_FindMaxSubStr(string Str)
{

	string Str = "abcdefgfed";

	int Length = Str.length();
	int **dp = new int *[Length];
	for (size_t i = 0; i < Length; i++)
	{
		dp[i] = new int[Length];
	}

	for (int i = 0; i < Length;i++)
	{
		for (int j = 0; j < Length; j++)
		{
			if (Str[i] == Str[j])
			{
				dp[i][j] = 1;
			}
		}
	}
	int ans = 0;
	for (int i = 0; i < Length;i++)
	{
		for (int j = 0; j < Length; j++)
		{
			int i1 = i;
			int j1 = j;
			int k = 0;
			while (dp[i1][j1] == 1)
			{
				k++;
				i1--;
				j1++;
				if (i1 < 0 || j1 >Length)
				{
					break;
				}
			}
			if (k > ans)
			{
				ans = k;

			}
		}
	}
	return ans;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值