回文串就是正反读都是一样的字符串,如aba, abba等。
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度。
【输入说明】
在程序当前目录下存在execute.stdin
文件,程序从execute.stdin
中取得输入数据。
execute.stdin
为单行文件,存放着小写英文字符组成的字符串S。
字符串长度 <= 10000。
【输出说明】
输出字符串的最长回文子串的长度。
【示例】
execute.stdin内容:aaaa
预期输出:4
execute.stdin内容:abab
预期输出:3
1.读入到数组里面
2.函数判断是否是回文用两个指针,两边往中间走
3.找最大回文 这里用的方法是
分两种,1221与121,然后遍历中间字符
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
bool isAym(char *cbegin, char *cend);
int getMaxSym2(char * str);
int main()
{
FILE *fin;
char filename[] = "execute.stdin";
fin = fopen(filename, "r+");
if (fin== NULL) {
printf("打开失败");
exit(0);
}
char cool[100];
int i = 0;
char ch = fgetc(fin);
while (ch != EOF) {
cool[i++] = ch;
ch = fgetc(fin);
}
cool[i] = '\0';
int x = getMaxSym2(cool);
printf("%d", x);
return 0;
}
bool isAym(char *cbegin, char *cend)
{
if (cbegin == NULL || cend == NULL || cbegin > cend)
{
return false;
}
while (cbegin<cend)
{
if (*cbegin != *cend)
{
return false;
}
cbegin++;
cend--;
}
return true;
}
int getMaxSym2(char * str)
{
if (str == NULL)
return 0;
int maxlength = 0;
char *p = str;
while ((*p) != '\0')
{
char *left = p - 1;
char *right = p + 1;
int length1 = 1;
while (left >= str && *right!= '\0' && *left == *right) {
left--; right++;
length1 += 2;
}
if (length1>maxlength) {
maxlength = length1;
}
left = p; right = p + 1;
int length2 = 0;
while (left >= str && (*right)!= '\0' && (*left == *right)) {
left--; right++;
length2 += 2;
}
if (length2>maxlength) {
maxlength = length2;
}
p++;
}
return maxlength;
}