Golang 最大回文子串(Manacher算法)

关于该算法的原理其他博客写的很清楚,我就不再重复了,此处直接贴代码


package main

import "fmt"

//用于存储最后长度最长的子串中间字符的信息
type str struct {
	i int    //位置
	num int   //数值
}

func longestPalindrome(s string) string {

    
	length := len(s)
	btyestr := []byte(s)

    if length<2 {
        return s
    }
    
	bytestr2 := make([]byte, 2*length+1)
	p := make([]int, 2*length+1)

	for m := 0; m < length; m++ {

		bytestr2[2*m] = 1
		bytestr2[2*m+1] = btyestr[m]

	}
	bytestr2[2*length] = 1

	fmt.Println(bytestr2)

    //在每个字符间插入相同的字符
	for i := 0; i < len(bytestr2); i++ {

		p[i] = 1
		if i != 0 && i != 2*length {
			for j := 1; ; j++ {
				if bytestr2[i-j] == bytestr2[i+j] {
					p[i] = p[i] + 1
				} else {
					break
				}
				if i-j == 0 || i+j == 2*length {
					break
				}
			}
		}
	}

	maxdata := str{0, 1}

	for j := 0; j < 2*length+1; j++ {

		if p[j] > maxdata.num {

			maxdata.i = j
			maxdata.num = p[j]
		}
	}

	bytestr3 := make([]byte, maxdata.num-1)
   //找出最长子串,跳过之前我自己添加的字符
	for h := 0; h < maxdata.num-1; h++ {
		if (maxdata.num-1)%2 == 0 {
		    //跳过之前我自己添加的字符,所以+2*h
			bytestr3[h] = bytestr2[maxdata.i+2-maxdata.num+2*h]
		} else {
			bytestr3[h] = bytestr2[maxdata.i+2-maxdata.num+2*h]
		}

	}

	ss := string(bytestr3)
	return ss
}

func main() {
	s := "aac123caa"
	longestPalindrome(s)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值