描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串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"))
}