求一个字符串中最长的回文子串。
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]))
}
}
manacher算法_求最长回文子串长度
很好的总结,转自: http://blog.csdn.net/dyx404514/article/details/42061017 总结为:两大情况,三小情况. 两大情况:I. i <= p 1 ...
马拉车算法,mannacher查找最长回文子串
作用: 在线性时间内找到一个字符串的最大回文子串 原理: 奇偶变换:为处理字符串方便,现将给定的任意字符串进行处理,使所有可能的奇数/偶数长度的回文子串都转换成了奇数长度. 具体就是在每个字符的两边都 ...
manacher算法学习(求最长回文子串长度)
Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include #include #include< ...
[hdu 3068] Manacher算法O(n)最长回文子串
一个不错的讲解:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/01.05.md # ...
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是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...
lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
1089 最长回文子串 V2(Manacher算法)
1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa ...
51nod1089(最长回文子串之manacher算法)
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...
python- shutil 高级文件操作
简介 shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 拷贝文件 shutil.copyfile(src, ...
ADO.NET 连接方式和非链接方式访问数据库
一.//连接方式访问数据库的主要步骤(利用DataReader对象实现数据库连接模式) 1.创建连接对象(连接字符串) SqlConnection con = new SqlConnection(Co ...
My Eclipse 自动提示
1.My Eclipse 自带代码提示快捷键 “ alt+/”. 2.输入即提示:window-->preferences-->java-->Editor 展开后点击Content ...
RabbitMQ 知识总结
RabbitMQ知识总结 AMQP协议 AMQP协议是一个提供统一消息服务的应用层标准协议,并不会受到客户端/中间件不同产品.不同开发语言等条件的影响.RabbitMQ则是基于该协议实现的. 举个例子 ...
C++ 变长模板参数
转载自: http://www.cnblogs.com/liyiwen/archive/2013/04/13/3018608.html C++11 语言核心的改进中,最为关注的有 rvalue ref ...
k8s Nodeport方式下service访问,iptables处理逻辑(转)
原文 https://www.myf5.net/post/2330.htm k8s Nodeport方式下service访问,iptables处理逻辑 2017年07月11日 0条评论 976次阅读 ...
ELF文件格式分析
一般的 ELF 文件包括三个索引表:ELF header,Program header table,Section header table. 1)ELF header:在文件的开始,保存了路 ...
【转载】EmptyWorkingSet 程序运行内存整清理
网络上找了很多关于内存整理的文章,不外乎都是使用EmptyWorkingSet来实现.就如下面这段代码. #include "stdafx.h"#include
会话控制(session和cookie)、跨页面传值
1.session 登录上一个页面以后,长时间没有操作,刷新页面以后需要重新登录. 特点:(1)session是存储在服务器: (2)session每个人(登陆者)存一份: (3)session ...
css中的圣杯布局和双飞翼布局
圣杯布局 布局要求: 三列布局,中间自适应,两边定宽 中间栏要在浏览器优先渲染 允许任意列的高度最高 用最简单的CSS.最少的HACK语句 解释说明: 1.min-width:700px是为了当页面缩 ...