对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int duiChengZiFuChuanlength(string zifuchuan,int left,int right) //1.先求出这道题目所要求的对成字符串。
{
while(left>=0&&right<zifuchuan.length()&&zifuchuan[left]==zifuchuan[right])
{
left--;
right++;
}
return right-left-1; //经过循环后,此时的left实为左边界+1,而right为右边界+1,按原数正常求字符段长为right-left+1,
} //而这里因为left和right的变化,所以是为(right+1)-(letf-1)+1=right-left+1。
int duiChengZiFuChuanMaxLength(string zifuchuan) //2.再从所有对称字符串中用两种计算方式求出最大对称字符串
{
if(zifuchuan.length()==0) return 0; //若长度为0,则直接返还0。
int maxLen=0; //初始化最长对称字符串为0,方便后面求最长对称字符串。
for(int i=0;i<zifuchuan.length();i++) //遍历所有的位置的字符串。
{
int len1=duiChengZiFuChuanlength(zifuchuan,i,i); //一种是同一个字符开始查找。
int len2=duiChengZiFuChuanlength(zifuchuan,i,i+1); //另一种是初定一个字符和下一个字符开始查找。
int len=max(len1,len2); //存储单个i指定查找后的最大对称字符串。
maxLen=max(maxLen,len); //所有对称字符串对比得出最大对称字符串。
}
return maxLen;
}
int main()
{
string zifuchuan; //3.再定义一个所需要输入的字符串,随后放入所写的函数后求出最大对称字符串。
getline(cin,zifuchuan);
int x=duiChengZiFuChuanMaxLength(zifuchuan);
cout<<x<<endl;
return 0;
}