将一个很长的字符串分割成一段一段的子串,要求子串都是回文串,有回文串就输出最长的,没有回文串就将字符一个个输出。
思路:和之前找字符串的的最长回文子串其实属于一类问题,还是需要先依次遍历整个字符串,找到字符串的最长回文子串。此时就需要返回最长子串的中心位置即最长回文子串的长度(由于需要返回两个值,在此直接在主函数中实现,并不使用函数调用的方式),然后根据最长回文子串的长度是奇数还是偶数,输出最长回文字串就可以了。
#include <iostream>
using namespace std;
int main( )
{
int count = 0;
int max = 0;//最长回文子串的长度
int max_index = 0;//最长回文子串的中心点位置
char str[] = "abcdefgh";
int n = strlen(str);
cout << "字符串的总长度为:" << n << endl;
//判断字符串是否为空
if (str == NULL || n<1)
{
return 0;
}
for (int i = 0; i < n; i++)
{
//字符串为奇数时
for (int j = 0; (i - j) >= 0 && (i + j)<n; j++)
{
if (str[i - j] != str[i + j])
{
break;
}
count = 2 * j + 1;
}
if (count > max)
{
max = count;
max_index = i;
}
//字符串为偶数时
for (int k = 0; (i - k) >= 0 && (i + k + 1) < n; k++)
{
if (str[i - k] != str[i + k + 1])
{
break;
}
count = 2 * k + 2;
}
if (count > max)
{
max = count;
max_index = i;
}
}
cout << "最长的回文子串的中心位置:" << max_index << endl;
cout << "最长的回文子串的长度是:" << max << endl;
if (max ==1)
{
for (int j = 0; j<n; j++)
{
cout << str[j]<<" ";
}
cout << endl;
}
if (max % 2 == 1&&max!=1)//最长的回文子串的长度是奇数
{
//字符串为奇数时
for (int j = (max_index - max / 2); j<max; j++)
{
cout << str[j];
}
cout << endl;
}
else
{
//字符串为偶数时
for (int j = (max_index - max / 2 + 1); j<max; j++)
{
cout << str[j];
}
cout << endl;
}
return 0;
}