go 刷算法第二题——最长回文子串
描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
示例1
输入:"abc1234321ab",12
返回值:7
思路: 穷举所有节点的方案。
满足条件时,存在以下两种情况
- index节点为对称轴节点 [...,1,2,1,...]
- index节点为对称轴左边第一个节点,对称轴不在节点上 [...,1,1,...]
package main import ( "strings" ) func solve(s string) int { // 括号用递归处理 // 加减乘除由于乘除优先级更高的特性,所以采用临时数组保存加减因子,加减因子上附加的乘除运算先进行 // 最后统计临时数组的所有加减因子之和 // 声明一个存放临时数据的数组 ints := make([]int, 0) // 下一个待入数组的数据的运算符,第一个为“+” var operator byte = '+' // 运算数字因子 tempNum := 0 // 字符串转数组 chars := []byte(s) l := 0 for i := 0; i < len(chars); i++ { c := chars[i] // 0~9 字符是数字 if c >= '0' && c <= '9' { tempNum = 10*tempNum + int(c-'0') } if '(' == c { l++ start, end := i+1, i+1 for l != 0 { if chars[end] == ')' { l-- } if chars[end] == '(' { l++ } end++ } i = end - 1 tempNum = solve(s[start:end]) } if strings.Contains("+-*/", string(c)) || i == len(chars)-1 { switch operator { case '+': ints = append(ints, tempNum) case '-': ints = append(ints, -tempNum) case '*': ints[len(ints)-1] *= tempNum case '/': ints[len(ints)-1] /= tempNum } tempNum = 0 operator = c } } result := 0 for _, el := range ints { result += el } return result } func main() { println(solve("1+2")) println(solve("((10+2)*10-(100-(10+20*10-(2*3)))*10*1*2)-2")) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律