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

  1. package main
  2. import "fmt"
  3. /*
  4. 马拉松算法,求最长回文子串,时间复杂度:线性
  5. */
  6. func main() {
  7. // 回文数
  8. str := "abcddcbadcbadcabdadacd"
  9. // 填充#变成奇数个元素
  10. strArray := make([]byte, 0, 2*len(str)+1) // 每个字符是一个byte
  11. for i := 0; i < len(str); i++ {
  12. strArray = append(strArray, str[i])
  13. strArray = append(strArray, '#')
  14. }
  15. fmt.Print("原始字符串:")
  16. for i := 0; i < len(strArray); i++ {
  17. fmt.Print(string(strArray[i]))
  18. }
  19. fmt.Println()
  20. // 每个字符的最大回文半径
  21. radiusLen := make([]int, len(strArray))
  22. // 最大回文半径的中心位置
  23. id := 0
  24. // 最大回文串的右边界
  25. maxIndex := 0
  26. // 遍历新的串
  27. for i := 0; i < len(strArray); i++ {
  28. // 如果i在最大回文串中,那么可以进行判断,加快算法效率
  29. if i < maxIndex {
  30. j := 2*id - i // j和i是id的对称点
  31. if radiusLen[j] < maxIndex-i {
  32. // j的半径被最长串包住,那么i的半径必然等于j
  33. radiusLen[i] = radiusLen[j]
  34. continue
  35. } else if radiusLen[j] > maxIndex-i {
  36. // j的半径超出了最长串,那么i的半径必然是 j-(id-radiusLen(id)) = maxIndex - i 可画图观察
  37. radiusLen[i] = maxIndex - i
  38. continue
  39. } else if radiusLen[j] == maxIndex-i {
  40. // j的半径刚刚好到达最长串边界,这时i的半径可能比j还大,循环不会退出
  41. radiusLen[i] = radiusLen[j]
  42. }
  43. }
  44. for {
  45. // i半径必须合理,不能超过数组界,以圆心向两边拓展,逐一比较字符是否相等
  46. if i-radiusLen[i] >= 0 && i+radiusLen[i] < len(strArray) && strArray[i-radiusLen[i]] == strArray[i+radiusLen[i]] {
  47. radiusLen[i] = radiusLen[i] + 1
  48. } else {
  49. break
  50. }
  51. }
  52. // 如果半径比最大串还大,换人!
  53. if radiusLen[i] > radiusLen[id] {
  54. maxIndex = i + radiusLen[i] - 1
  55. id = i
  56. }
  57. }
  58. fmt.Print("处理完最长回文子串:")
  59. for i := id - (radiusLen[id] - 1); i <= id+(radiusLen[id]-1); i++ {
  60. fmt.Print(string(strArray[i]))
  61. }
  62. }

转载请注明: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. [游戏开发]LÖVE2D(1):引擎介绍

    什么是LÖVE引擎 Love引擎是一个非常棒的框架,你可以用来在Lua制作2D游戏.它是免费的,开源的,适用于Windows,Mac OS X,Linux,Android和iOS. 怎么安装 在官网下 ...

  2. netty 聊天室

    https://blog.csdn.net/qq_37372007/article/details/82937584 使用netty实现一个多人聊天室--failed: Error during We ...

  3. List三个子类的特点

    List的三个子类的特点 ArrayList: 底层数据结构是数组,查询快,增删慢. 线程不安全,效率高. Vector: 底层数据结构是数组,查询快,增删慢. 线程安全,效率低. Vector相对A ...

  4. osg 在fbx模型中添加自定义节点

  5. pycurl模块

    pycurl的使用 pycurl是curl的一个python版本. pycurl的使用说明: pycurl的使用主要是一些参数的设定. 1,c.setopt(pycurl.URL,myurl) 设定链 ...

  6. 【Leetcode_easy】804. Unique Morse Code Words

    problem 804. Unique Morse Code Words solution1: class Solution { public: int uniqueMorseRepresentati ...

  7. 【Leetcode_easy】690. Employee Importance

    problem 690. Employee Importance 题意:所有下属和自己的重要度之和,所有下属包括下属的下属即直接下属和间接下属. solution:DFS; /* // Employe ...

  8. iOS笔试题04

    1. Object-C有多继承吗?没有的话用什么代替?
 1> OC是单继承,没有多继承 2> 有时可以用分类category和协议protocol来代替多继承 2. Object-C有私 ...

  9. iOS技术面试07:第三方框架

    1ios框架分为:cocoa Touch:UIKit.Foundation.附属框架 Media:OpenGL ES.EAGL.Quartz.Core Animation.Core Audio.    ...

  10. 01.轮播图之五 :一个 imageView也能 作 轮播

    这个是最近才写的,本以为实现起来很有难度,需要更高深的理论, 写完之后,才发现自己错误的离谱: 之所以能用一个imageview 实现轮播 基于两点::: 使用 imageview 的layer 层设 ...