求一个字符串中最长的回文子串。

package main

import "fmt"

/*
马拉松算法,求最长回文子串,时间复杂度:线性
*/
func main() {
// 回文数
str := "abcddcbadcbadcabdadacd" // 填充#变成奇数个元素
strArray := make([]byte, 0, 2*len(str)+1) // 每个字符是一个byte for i := 0; i < len(str); i++ {
strArray = append(strArray, str[i])
strArray = append(strArray, '#')
} fmt.Print("原始字符串:")
for i := 0; i < len(strArray); i++ {
fmt.Print(string(strArray[i]))
}
fmt.Println() // 每个字符的最大回文半径
radiusLen := make([]int, len(strArray)) // 最大回文半径的中心位置
id := 0 // 最大回文串的右边界
maxIndex := 0 // 遍历新的串
for i := 0; i < len(strArray); i++ {
// 如果i在最大回文串中,那么可以进行判断,加快算法效率
if i < maxIndex {
j := 2*id - i // j和i是id的对称点 if radiusLen[j] < maxIndex-i {
// j的半径被最长串包住,那么i的半径必然等于j
radiusLen[i] = radiusLen[j]
continue
} else if radiusLen[j] > maxIndex-i {
// j的半径超出了最长串,那么i的半径必然是 j-(id-radiusLen(id)) = maxIndex - i 可画图观察
radiusLen[i] = maxIndex - i
continue
} else if radiusLen[j] == maxIndex-i {
// j的半径刚刚好到达最长串边界,这时i的半径可能比j还大,循环不会退出
radiusLen[i] = radiusLen[j]
}
} for {
// i半径必须合理,不能超过数组界,以圆心向两边拓展,逐一比较字符是否相等
if i-radiusLen[i] >= 0 && i+radiusLen[i] < len(strArray) && strArray[i-radiusLen[i]] == strArray[i+radiusLen[i]] {
radiusLen[i] = radiusLen[i] + 1
} else {
break
}
} // 如果半径比最大串还大,换人!
if radiusLen[i] > radiusLen[id] {
maxIndex = i + radiusLen[i] - 1
id = i
}
} fmt.Print("处理完最长回文子串:")
for i := id - (radiusLen[id] - 1); i <= id+(radiusLen[id]-1); i++ {
fmt.Print(string(strArray[i]))
}
}

转载请注明:http://www.lenggirl.com/algorithm/mala.html

面试经典算法:马拉松算法,最长回文子串Golang实现的更多相关文章

  1. Manacher (马拉车) 算法:解决最长回文子串的利器

    最长回文子串 回文串就是原串和反转字符串相同的字符串.比如 aba,acca.前一个是奇数长度的回文串,后一个是偶数长度的回文串. 最长回文子串就是一个字符串的所有子串中,是回文串且长度最长的子串. ...

  2. Manacher算法讲解——字符串最长回文子串

    引 入 引入 引入 Manachar算法主要是处理字符串中关于回文串的问题的,这没什么好说的. M a n a c h e r 算 法 Manacher算法 Manacher算法 朴素 求一个字符串中 ...

  3. manacher算法_求最长回文子串长度

    很好的总结,转自: http://blog.csdn.net/dyx404514/article/details/42061017 总结为:两大情况,三小情况. 两大情况:I. i <= p 1 ...

  4. 马拉车算法,mannacher查找最长回文子串

    作用: 在线性时间内找到一个字符串的最大回文子串 原理: 奇偶变换:为处理字符串方便,现将给定的任意字符串进行处理,使所有可能的奇数/偶数长度的回文子串都转换成了奇数长度. 具体就是在每个字符的两边都 ...

  5. manacher算法学习(求最长回文子串长度)

    Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...

  6. [hdu 3068] Manacher算法O(n)最长回文子串

    一个不错的讲解:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/01.05.md # ...

  7. 使用manacher算法解决最长回文子串问题

    要解决的问题 求一个字符串最长回文子串是什么.且时间复杂度 O(N) 具体描述可参考: LeetCode_5_最长回文子串 LintCode_200_最长回文子串 暴力解法 以每个字符为中心向左右两边 ...

  8. hihocoder #1032 : 最长回文子串 Manacher算法

    题目链接: https://hihocoder.com/problemset/problem/1032?sid=868170 最长回文子串 时间限制:1000ms内存限制:64MB 问题描述 小Hi和 ...

  9. hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]

    传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...

随机推荐

  1. python人生如初见之初见yield

    今天学习爬虫Scrapy框架搭建的时候,了解了yield的用法.了解一个东西,无外乎 WHAT? HOW? WHY? WHAT yield英文意思是屈服,退位,放弃.额...其实它是Python中的一 ...

  2. Python JSON 字符串 转 json 基本使用

    字符串 转  json import json jsonData = '{"a":1,"b":2,"c":3,"d":4 ...

  3. ArcGIS超级工具SPTOOLS1.7升级说明

    ArcGIS超级工具1.7升级说明:多了:5个工具,总87工具. 5.11   数据打包 44 5.11.1.  mxd批量打包MPK:对一个文件夹所有MXD打包MPK 5.11.2.  mxd文档发 ...

  4. 《你不知道的JavaScript(上)》笔记——this全面解析

    首先要理解调用位置: 调用位置就是函数在代码中被调用的位置(而不是声明的位置). 最重要的是要分析调用栈(就是为了到达当前执行位置所调用的所有函数). 我们关心的调用位置就在当前正在执行的函数的前一个 ...

  5. vue 自定义全局方法

    import {myfun} from '../static/js/test.js' //se6的正确写法export default {methods:{ diyfun:function () { ...

  6. 亲历谷歌 Chrome 浏览器弹窗境外广告的解决方法(图) | 技术乐园

    亲历谷歌 Chrome 浏览器弹窗境外广告的解决方法(图) | 技术乐园 转 https://www.hack520.com/338.html 谷歌的 Chrome 浏览器是我非常喜欢的一款的浏览器, ...

  7. colorMatrix色彩旋转设置

    package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...

  8. Vue+MySQL实现购物车的增删改查

    1,创建简单数据库数据表 2,创建Mapper文件 <!--查询商品--> <select id="selectcommodity" resultType=&qu ...

  9. Block pool ID needed, but service not yet registered with NN java.lang.Exception: trace 异常解决

    以上为报错信息: 原因大概为:dd和nd关联的versionId不同导致, 解决方案,备份之前的current文件夹,让其自己生成新的.

  10. Go项目部署到服务器

    -bash: ./main: cannot execute binary file 将 go build main.go 生成的文件上传到服务器后,./main 运行后出新的报错 env GOOS=l ...