您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-31 21:08 344 查看
回文串是指存在这样一种字符串,正读和反读所得到的结果都是一样的,例如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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐