ACM学习历程24——最大回文子串

回文串是指存在这样一种字符串,正读和反读所得到的结果都是一样的,例如1234321,无论正读和反读得到的都是一样的序列。最大回文子串问题是字符串操作的基本类型之一,求解字符串的最大回文字符串要求从一个字符串中找出存在的最大长度的回文子串。求解字符串的最大回文子串的思路有如下两种,当然不限于这两种方法,在后面将介绍其他算法思想。

一、若字符串的长度为N,定义变量i和变量j,其中i的范围为0<=i<=N-1,i<=j<=N-1,那么对于在闭区间[i,j],i+j的值为一个确定的值,如果在(k=i;k<=j;k++)的条件下,始终有s[k]==s[i+j-k],那么这就是一个可能的回文串,至于是不是最大的回文子串,则要根据具体的代码来判断。可以先设置一个变量max=0,用来记录每一次检测到一个回文串时,是否比上次找的回文串长度更大,若比上一次大,则将该回文子串的长度赋值给max,为了输出该最大回文串,设置mark1和mark2记录回文串开始和结束的位置。

#include<iostream>
#include<string>
using namespace std;

int main()
{
	int i,j,k;
	char ss[512];
	string s;
	while(cin.getline(ss,512))
	{
		s=ss;
		int length=s.length();
		int max=0,mark1=0,mark2=0;

		for(i=0;i<length;i++)
		{
			for(j=i;j<length;j++)
			{
				int flag=1;
				for(k=i;k<=j;k++)
				{
					if(s[k]!=s[i+j-k])
					{
						flag=0;
						break;
					}
				}
				if(flag && j-i+1>max)
				{
					max=j-i+1;
					mark1=i;
					mark2=j;
				}
			}
		}
		cout<<"The length of palindrome string="<<max<<endl;
		cout<<"The palindrome string=";
		for(int i=mark1;i<=mark2;i++)
			cout<<s[i];
		cout<<endl;
	}
	return 0;
}
测试输出:
1
The length of palindrome string=1
The palindrome string=1
12
The length of palindrome string=1
The palindrome string=1
1212
The length of palindrome string=3
The palindrome string=121
12345666543777
The length of palindrome string=9
The palindrome string=345666543
12345657
The length of palindrome string=3
The palindrome string=565
二、从字符串的中间某个位置开始向两侧探测,设变量i,其中(i=0;i<len;i++),那么从i的位置开始向两侧探测每次同时向两侧移动一个字符若移动后对应的两个字符相等,则继续移动,直到不相等为止。

#include<iostream>
#include<string>
using namespace std;

int main()
{
	int i,j,k;
	char ss[512];
	string s;
	while(cin.getline(ss,512))
	{
		s=ss;
		int length=s.length();
		int max=0,mark1=0,mark2=0;
		for(i=0;i<length;i++)
		{
			//如果s为奇数串
			for(j=0;j<=i&&j+i<length;j++)
			{
				if(s[i-j]!=s[i+j])
					break;
				if(2*j+1>max)
				{
					max=2*j+1;
					mark1=i-j;
					mark2=i+j;
				}
			}
			//如果是偶数串
			for(j=0;j<=i&&i+j+1<length;j++)
			{
				if(s[i-j]!=s[i+j+1])
					break;
				if(2*j+2>max)
				{
					max=2*j+2;
					mark1=i-j;
					mark2=i+j+1;
				}
			}
		}
		cout<<"The length of palindrome string="<<max<<endl;
		cout<<"The palindrome string=";
		for(int i=mark1;i<=mark2;i++)
			cout<<s[i];
		cout<<endl;
	}
	return 0;
}
测试输出:
1
The length of palindrome string=1
The palindrome string=1
12
The length of palindrome string=1
The palindrome string=1
1221
The length of palindrome string=4
The palindrome string=1221
11
The length of palindrome string=2
The palindrome string=11
12345676588
The length of palindrome string=5
The palindrome string=56765

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值