描述

给定一个仅包含小写字母的字符串,求它的最长回文子串的长度。
所谓回文串,指左右对称的字符串。
所谓子串,指一个字符串删掉其部分前缀和后缀(也可以不删)的字符串
数据范围:字符串长度1s350 
进阶:时间复杂度:O(n) ,空间复杂度:O(n) 

输入描述:

输入一个仅包含小写字母的字符串

输出描述:

返回最长回文子串的长度

示例1

输入:
cdabbacc
复制
输出:
4
说明:
abba为最长的回文子串  
代码部分:
#include <stdio.h>
#include <string.h>
//以下是Senky的代码:
//算法写在前面:先从长度为2的回文串开始找,找到了就记录长度,没找到就找长度为3的回文串
//例aba,没有长度为2的回文串,但是有长度为3的回文串

int Judge(char const* p, int maxlen) {//char const* p,不改变字符串的字符
    int left = 0; //左指针为p的首元素
    int right = maxlen - 1; //右指针为p的尾元素
    int flag = 1; //标记初始化为1
    while (left < right) {//左指针小于右指针循环继续
        if (p[left] == p[right]) {//两端元素相等
            left++;
            right--;
        } else {
            flag = 0; //不是回文串则直接退出while循环
            break;
        }
    }
    return flag;
}

int main() {
    char s[350];
    scanf("%[^\n]", s); //从缓存区读取一行字符串
    int size = (int)strlen(s); //字符串的长度
    int maxlen = 1; //最大回文串的长度,初始化为1
    int len = 2; //当前传入Judge字符串的长度,初始化为2
    int flag = 0; //找到回文串的标记位,默认为0
    int i = 0;//p指向的字符的数组下标
    while (len <= size) {//子串应该小于等于母串
        char* p = s;//每次len更新,p都指向s[0]
        for (i = 0; i + len - 1 < size; i++) { //从首元素开始循环遍历找子串
            flag = Judge(p,len); //用指针p和当前字符串长度,判断当前串是不是回文串
            if (flag) {
                maxlen = len; //当前len的回文串已找到,更新maxlen
            }
            p++;//无论找到没有,p都指向下一个
        }
        len++;//当前for循环len长度找完就len+1,然后p再指向s[0]
    }
    printf("%d",maxlen);
    return 0;//编辑于2022/10/10
}
总结
① 非最优算法,时间复杂度为O(n²),日后完善O(n)  
  当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;