问题描述
给定一个字符串,输出所有长度至少为2的回文子串。
回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。
输入
一个字符串,由字母或数字组成。长度500以内。
输出
输出所有的回文子串,每个子串一行。
子串长度小的优先输出,若长度相等,则出现位置靠左的优先输出。
样例输入
123321125775165561
样例输出
33
11
77
55
2332
2112
5775
6556
123321
165561
可以考虑自己定义一个判断字符串是否为回文字符串的函数。
需要使用的string类的reverse方法对字符串进行反转,若反转之后的字符串和原字符串相等,则为回文字符串。
bool isPalin(string str)//判断str是不是回文串
{
string s1(str);//初始化s1和str相同
reverse(s1.begin(), s1.end());//将s1逆序
return str == s1;//如果逆序后和原字符串相同,那么就是回文串
}
判断子串需要先选取子串,可以按照子串长度遍历。从长度为2的子串开始:
for(int l = 2; l <= len; ++l)//回文子串长度
for(int i = 0; i <= len-l; ++i)//最后一次看从len-l~len-1共l个字符是不是回文串
string sub = s.substr(i, l);
上述代码是取出所有子串。
完整代码如下所示:
#include<iostream>
using namespace std;
string s;
bool isPalin(string str)//判断str是不是回文串
{
string s1(str);
reverse(s1.begin(), s1.end());
return str == s1;
}
int main()
{
cin >> s;
int len = s.length();
for (int l = 2; l <= len; ++l)
{
for (int i = 0; i <= len - l; ++i)
{
string sub = s.substr(i, l);
if (isPalin(sub))
cout << sub << endl;
}
}
return 0;
}