面试经典算法:马拉松算法,最长回文子串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是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...
随机推荐
- flutter doctor出现问题 [!] Android toolchain - develop for Android devices (Android SDK version 28.0.3) X Android license status unknown. Try re-installing or updating your Android SDK Manager. 的解决方案
首先,问题描述: flutter doctor Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Cha ...
- python 使微信自动回复
https://zhuanlan.zhihu.com/p/308999073 今天是鄙人的生日,欢luo过后想写点关于itchat的文章~ (不小心暴露年龄了,是的,我已经16岁了~~) 言归正传,这 ...
- Centos7安装zabbix3.4.0以及配置和使用
一.安装ZABBIX 1.环境和软件版本 注:此次是采用的rpm包方式安装,所以服务器必须要能连接互联网通过yum方式解决依赖关系 ①系统: [root@zabbix ~]# cat /etc/red ...
- 怎样加入社区项目Karbor的Review?
Review是社区衡量一个贡献者的重要标准. Review步骤: 1.登录Karbor Review地址: https://review.openstack.org/#/q/Karbor 这里可以看到 ...
- CentOS7下搭建zabbix监控(二)——Zabbix被监控端配置
Zabbix监控端配置请查看:CentOS7下搭建zabbix监控(一)——Zabbix监控端配置 (1).在CentOS7(被监控端)上部署Zabbix Agent 主机名:youxi2 IP地址: ...
- Django之form表单验证顺序
概述 django框架提供了一个forms类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证支持. 验证过程 ...
- PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)
1051 Pop Sequence (25 分) Given a stack which can keep M numbers at most. Push N numbers in the ord ...
- 使用MockMvc进行springboot调试(SpringbootTest)
测试前关闭web项目.springboot启动程序WebApplication.class 笔者本地自定了端口SpringBootTest.WebEnvironment.DEFINED_PORT 代码 ...
- MySQL建表时添加备注以及查看某一张表的备注信息
建表的时候对列和表明添加备注: DROP TABLE IF EXISTS test_table; CREATE TABLE test_table ( ID INTEGER AUTO_INCREMENT ...
- 使用javamelody监控springboot项目
JavaMelody是用来在QA和实际运行生产环境中监控Java或Java EE应用程序服务器的一个开源框架.它不是一个工具来模拟来自用户的请求,而是一个测量和计算用户在实际操作中应用程序的使用情况的 ...