描述
给定一个仅包含小写字母的字符串,求它的最长回文子串的长度。
所谓回文串,指左右对称的字符串。
所谓子串,指一个字符串删掉其部分前缀和后缀(也可以不删)的字符串
数据范围:字符串长度1≤s≤350
进阶:时间复杂度: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) ;
② 当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;