面试经典算法:马拉松算法,最长回文子串Golang实现
求一个字符串中最长的回文子串。

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实现的更多相关文章
- Manacher (马拉车) 算法:解决最长回文子串的利器
最长回文子串 回文串就是原串和反转字符串相同的字符串.比如 aba,acca.前一个是奇数长度的回文串,后一个是偶数长度的回文串. 最长回文子串就是一个字符串的所有子串中,是回文串且长度最长的子串. ...
- Manacher算法讲解——字符串最长回文子串
引 入 引入 引入 Manachar算法主要是处理字符串中关于回文串的问题的,这没什么好说的. M a n a c h e r 算 法 Manacher算法 Manacher算法 朴素 求一个字符串中 ...
- manacher算法_求最长回文子串长度
很好的总结,转自: http://blog.csdn.net/dyx404514/article/details/42061017 总结为:两大情况,三小情况. 两大情况:I. i <= p 1 ...
- 马拉车算法,mannacher查找最长回文子串
作用: 在线性时间内找到一个字符串的最大回文子串 原理: 奇偶变换:为处理字符串方便,现将给定的任意字符串进行处理,使所有可能的奇数/偶数长度的回文子串都转换成了奇数长度. 具体就是在每个字符的两边都 ...
- manacher算法学习(求最长回文子串长度)
Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...
- [hdu 3068] Manacher算法O(n)最长回文子串
一个不错的讲解:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/01.05.md # ...
- 使用manacher算法解决最长回文子串问题
要解决的问题 求一个字符串最长回文子串是什么.且时间复杂度 O(N) 具体描述可参考: LeetCode_5_最长回文子串 LintCode_200_最长回文子串 暴力解法 以每个字符为中心向左右两边 ...
- hihocoder #1032 : 最长回文子串 Manacher算法
题目链接: https://hihocoder.com/problemset/problem/1032?sid=868170 最长回文子串 时间限制:1000ms内存限制:64MB 问题描述 小Hi和 ...
- hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]
传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...
随机推荐
- 关于JAVA线程池-ThreadPoolExecutor
1. 源码翻译 /* * * * * * * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Grou ...
- oracle之按表名查询表字段结构
工作中查看oracle表结构, 1,pl/sql或其他开发工具可以输入表名然后ctr+点击表名就可以看见表结构: 2,表字段过多,如果给第三方截图看比较麻烦,得截好几次,容易看眼花,可以查询如下sql ...
- 4.弹性网络( Elastic Net)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_21904665/article/details/52315642 ElasticNet 是一种 ...
- OPPO数据中台之基石:基于Flink SQL构建实数据仓库
小结: 1. OPPO数据中台之基石:基于Flink SQL构建实数据仓库 https://mp.weixin.qq.com/s/JsoMgIW6bKEFDGvq_KI6hg 作者 | 张俊编辑 | ...
- python代码-leetcode2 链表-两数相加
示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 # Definitio ...
- osg::NodeVisitor example
[0]osg::Group [1]osg::MatrixTransform [1] osg::MatrixTransform [1]osg::MatrixTransform [2] osg::Geod ...
- 【424】C语言二级指针
参考:C 指向指针的指针 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链.通常,一个指针包含一个变量的地址.当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向 ...
- request cluster ID mismatch
删除了etcd集群所有节点中的--data_dir的内容 [root@node3 ~]# cd /var/lib/etcd/ [root@node3 etcd]# ls member [root@no ...
- 源码安装LNMP
需要准备的安装包以及下载地址(只是一个大概地址,版本和下载方式需要自行选择): Nginx http://nginx.org/en/download.html nginx主程序包 MySQL http ...
- Python简单计算数组元素平均值的方法示例
Python简单计算数组元素平均值的方法示例 本文实例讲述了Python简单计算数组元素平均值的方法.分享给大家供大家参考,具体如下: Python 环境:Python 2.7.12 x64 IDE ...