go 刷算法第二题——最长回文子串

描述

对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。

给定字符串A以及它的长度n,请返回最长回文子串的长度。

示例1

输入:"abc1234321ab",12
返回值:7

思路: 穷举所有节点的方案。
满足条件时,存在以下两种情况

  1. index节点为对称轴节点 [...,1,2,1,...]
  2. 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"))
}

posted @ 2021-09-17 20:58  临渊不羡渔  阅读(97)  评论(0编辑  收藏  举报