串的块链存储c语言栈 回文串,面试经典算法:马拉松算法,最长回文子串Golang实现...

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

46b4775326341cc9ffa2a3e81b3821fd.png

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算法&lowbar;求最长回文子串长度

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

马拉车算法&comma;mannacher查找最长回文子串

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

manacher算法学习&lpar;求最长回文子串长度&rpar;

Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include #include #include&lt ...

&lbrack;hdu 3068&rsqb; Manacher算法O&lpar;n&rpar;最长回文子串

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

hihocoder &num;1032 &colon; 最长回文子串 Manacher算法

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

hihoCoder &num;1032 &colon; 最长回文子串 &lbrack; Manacher算法--O(n)回文子串算法 &rsqb;

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

lintcode最长回文子串&lpar;Manacher算法&rpar;

题目来自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&lpar;最长回文子串之manacher算法&rpar;

题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...

随机推荐

python- shutil 高级文件操作

简介 shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 拷贝文件 shutil.copyfile(src, ...

ADO&period;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&plus;&plus; 变长模板参数

转载自: http://www.cnblogs.com/liyiwen/archive/2013/04/13/3018608.html C++11 语言核心的改进中,最为关注的有 rvalue ref ...

k8s Nodeport方式下service访问,iptables处理逻辑&lpar;转&rpar;

原文 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是为了当页面缩 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值