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; }