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;

}
经验分享 程序员 微信小程序 职场和发展