C++上机题5 回文字符串
【问题描述】
回文字符串是具有回文特性的字符串:即该字符串从左向右读和从右向左读都一样,单独的字母不作为回文字符串,例如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;
}
				       
			          
