【问题描述】
回文字符串是具有回文特性的字符串:即该字符串从左向右读和从右向左读都一样,单独的字母不作为回文字符串,例如abcddcba即为一个长度为8的回文字符串。 编写一个程序,输入一个全是字母的字符串,找出字符串中最长的回文字符串,输出最长回文字符串的长度和最长的回文字符串(长度相同的输出第一个),若无回文字符串,只输出0。
【输入形式】
-
输入第一行为只含字母的字符串,长度不超过10000字符。
【输出形式】
-
输出结果第一行为最长回文字符串的长度
-
输出结果第二行为最长的回文字符串
【样例输入1】
abcdef
【样例输出1】
0
【样例输入2】
abcba
【样例输出2】
5 abcba
【样例输入3】
aAabccbaABcdcBA
【样例输出3】
8 AabccbaA
——————————————————————————————————————————
1.这道题有不少更好的解法,但是那些好的解法我现在还看不懂,所以就用了一个比较笨的方法。
#include<iostream>
using namespace std;
#include<string>
#include<algorithm>
int main()
{
string s;
cin>>s;
if(s.size() == 0 || s.size() < 2)
{
cout<< 0;
return 0;
}
int max = 0;
string ret;
for(int i = 0;i < s.size();i++)
{
for(int j = 1;j < s.size();j++)
{
string tmp = s.substr(i,j-i+1);//这里用substr来截取s中从i到j-i+1的字符
string tmpr(tmp);//对截取得到的字符串进行反转
reverse(tmp.begin(),tmp.end());
if(tmp == tmpr && tmp.size() > max)//看截取部分反转前后是否一样,从而判断他是不是回文字符串
{
max = tmp.size();//用max代指最大的回文字符串,遇到比他更大的则更新max和代指回文字符串的ret
ret = s.substr(i,j-i+1);
}
}
}
if(max==1)这里是为了当没有长度大于1的回文字符串时,输出0
{
max=0;
cout<<0;
}
else
{cout<<max;
cout<<endl;
cout<<ret;}
return 0;
}