题解 | 华为HJ85#最长回文子串#
最长回文子串
https://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507
描述
给定一个仅包含小写字母的字符串,求它的最长回文子串的长度。
所谓回文串,指左右对称的字符串。
所谓子串,指一个字符串删掉其部分前缀和后缀(也可以不删)的字符串
数据范围:字符串长度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) ;
② 当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;
华为-HJ 文章被收录于专栏
机试的题解
