最长回文子串

本文详细解析了寻找字符串中最长回文子串的算法实现。通过动态规划的方法,利用二维数组记录子串是否为回文,最终找出最长的回文子串。文章提供了完整的代码示例,包括初始化、推导过程及结果排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最长回文子串

在这里插入图片描述
babad举例子

babad
boxoxx
axoxox
boxoxx
axoxox
dxxxxo

回文子串相当于二维数组,需要知道开始和结束位置,表中o代表是回文,横纵坐标分表代表开始和结束位置,其中有一边(开始大于结束忽略,对称的)

s 是字符串,长度用s(i,j)表示,i开始位置,j结束位置
判断s是回文,需要判断s[i] == s[j], && s[i+1, j-1]是回文
默认s[i][i]是回文

// 状态:s[i][j] 表示i到j是一个回文字符串
// 推导:s[i][j] a[i]==a[j]&&s[i+1][j-1]==true
// 初始化:s[j][j] = true

func longestPalindrome(s string) string {

	if s == "" {
		return ""
	}

	if len(s) == 1 {
		return s
	}

	flag := make([][]bool, len(s))
	str := make([]string, 0)
	str = append(str, s[0:1])
	for i := 0; i < len(s); i++ {
		flag[i] = make([]bool, len(s))
	}

	//
	for j := 1; j < len(s); j++ {
		flag[j][j] = true
		for i := 0; i < j; i++ {
			// 推导过程
			if s[j] == s[i] && (i+1 >= j-1 || flag[i+1][j-1]) {
				flag[i][j] = true
				str = append(str, s[i:j+1])
			}
		}
	}

	sort.Slice(str, func(a, b int) bool {
		return len(str[a]) < len(str[b])
	})


	return str[len(str)-1]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值