当前位置: 首页 > news >正文

LeeCode 5. 最长回文字串

给你一个字符串 s,找到 s 中最长的 回文 子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

 答案:

char* longestPalindrome(char* s) { // leeCode 5.最长回文子串
	size_t len = strlen(s);

	// 如果字符串长度大于2,如果它是回文串,则去掉头和尾仍然是回文串,所以可以推导公式。
	// 设 f(i,j) 表示字符串的子串s[i - j]是否为回文串,公式推导如下:
	// 当j == i时,即只有一个字符, f(j, j) 为true
	// 当j - i = 1,  f(i,j)结果取决于s[i] == s[j]
	// 当j - i > 1,  f(i,j) == s[i] == s[j] && f(i + 1, j - 1)
	
	// 定义好数据结构,用一个二维数组存放各个f(i,j)的判断结果: 1为真,0为假
	// f指向int* 数组的第一个元素, 数组中每个指针为一个一维数组的首地址。最终求f[i][j]为true时表示的最长字串。
	int** f = (int**)malloc(sizeof(int*) * len);
	if (f == NULL) {
		fprintf(stderr, "malloc return null");
		exit(EXIT_FAILURE);
	}
	for (int i = 0; i < len; i++) {
		// f[i] 保存的是一维数组的首地址
		f[i] = (int*) malloc(sizeof(int) * len);
		if (f[i] == NULL) {
			fprintf(stderr, "malloc return null");
			exit(EXIT_FAILURE);
		}
	}

	// 循环遍历字串,注意遍历顺序,确保能按顺便推导出结果,即计算f[i][j]时,要保证前面已经计算过f[i + 1][j - 1]的值
	int m = 0, n = 0, maxLen = 1;
	for (int j = 0; j < len; j++) {
		for (int i = 0; i <= j; i++) {
			if (i == j) {
				f[i][j] = 1;
			}
			else if (j - i == 1) {
				f[i][j] = s[i] == s[j] ? 1 : 0;
			}
			else {
				f[i][j] = (s[i] == s[j] && f[i + 1][j - 1]) ? 1 : 0;
			}
			if (f[i][j] && j - i + 1 > maxLen) {
				m = i;
				n = j;
				maxLen = j - i + 1;
			}
		}
	}

	// 释放内存
	for (int i = 0; i < len; i++) {
		free(f[i]);
	}
	free(f);

	char* res = (char*)malloc(sizeof(char) * (maxLen + 1)); // 字符串结束标志‘\0’也占一个位置
	if (res) {
		memcpy(res, &s[m], maxLen);
		res[maxLen] = '\0';
	}
	else {
		fprintf(stderr, "malloc return null");
		exit(EXIT_FAILURE);
	}
	return res;
}

测试代码:

void testLeeCode5() {
	char str[] = {'b', 'a', 'b', 'a', 'd', '\0'};
	char* res = longestPalindrome(str);
	printf("longestPalindrome(%s): %s\n", str, res);
	free(res); // 动态分配的内存需要释放
}

打印结果:

ok, 代码提交到LeeCode:

ok, 性能好像不怎么优秀,没看出为啥

http://www.dtcms.com/a/109961.html

相关文章:

  • QT Quick(C++)跨平台应用程序项目实战教程 6 — 弹出框
  • UE5学习笔记 FPS游戏制作40 制作鼠标移入UI显示提示背景色的效果
  • C 语言中的递归:概念、应用与实例解析
  • 3D动画动作捕捉设备:惯性动捕赋能轻量级影视动画创作
  • Python Cookbook-5.1 对字典排序
  • 新版本AndroidStudio配置maven阿里云镜像
  • AI技术新突破:多模态与语音大模型重塑智能交互
  • VTK的两种显示刷新方式
  • 06-Spring 中的事件驱动机制
  • JAVA学习小记之IO流04--转换流篇
  • EasyExcel 数据字典转换器实战:注解驱动设计
  • Django4.0的快速查询以及分页
  • Flink SQL-Client Kafka connector
  • Uni-app 项目 PDF 批注插件库在线版 API 示例教程
  • Ceph异地数据同步之-RBD异地同步复制(上)
  • 每日一题(小白)ASCLL娱乐篇5
  • ARM架构+CODESYS:解锁嵌入式边缘计算的实时控制新范式
  • MIT6.828 Lab3-2 Print a page table (easy)
  • 大数据学习(98)-数据治理
  • 预测分析(二):基于机器学习的数值预测
  • 【大模型基础_毛玉仁】6.3 知识检索
  • API接口调用
  • 通信算法之256: 无人机Remote ID(远程识别)
  • adc推荐,单通道,双极性采集
  • 最近常用 python 记录
  • 环境数据综合分析系统
  • 贤小二c#版Yolov5 yolov8 yolov10 yolov11自动标注工具 + 免python环境 GPU一键训练包
  • 贴片加工SMT厂核心工艺解析
  • 码界奇缘 Java 觉醒 第二章 变量迷城
  • 计算机网络-TCP的重传机制