2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?
福哥答案2021-02-06:
1.动态规划。无代码,见图。
2.中心扩展法。无代码。
3.Manacher算法。有代码,见图。
1)理解回文半径数组。
2)理解所有中心的回文最右边界R,和取得R时的中心点C。
3)理解   L…(i`)…C…(i)…R  的结构,以及根据i’回文长度进行的状况划分。
4)每一种情况划分,都可以加速求解i回文半径的过程。
代码用的是第3种方法,用golang编写,代码如下:
package main
import "fmt"
func main() {
    fmt.Println("yyabcbaxxx的最长回文子串长度是:", manacher("yyabcbaxxx"))
}
func manacherString(s string) string {
    ret := "#"
    sLen := len(s)
    for i := 0; i < sLen; i++ {
        ret += fmt.Sprintf("%c#", s[i])
    }
    return ret
}
func manacher(s string) int {
    str := manacherString(s)
    strLen := len(str)
    pArr := make([]int, strLen)
    C := -1
    R := -1
    ret := 1
    for i := 0; i < strLen; i++ {
        if R > i {
            pArr[i] = getMin(R-i, pArr[2*C-i])
        } else {
            pArr[i] = 1
        }
        for i+pArr[i] < strLen && i-pArr[i] >= 0 {
            if str[i+pArr[i]] == str[i-pArr[i]] {
                pArr[i]++
            } else {
                break
            }
        }
        if i+pArr[i] > R {
            R = i + pArr[i]
            C = i
        }
        ret = getMax(ret, pArr[i])
    }
    return ret - 1
}
func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}
func getMin(a int, b int) int {
    if a < b {
        return a
    } else {
        return b
    }
}
执行结果如下:
***
[左神java代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class28/Code01_Manacher.java)
[力扣5. 最长回文子串](https://leetcode-cn.com/problems/longest-palindromic-substring/)
2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?的更多相关文章
- 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。
		[题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ... 
- 【每日一题】【奇偶分别中心扩展/动态规划】2022年2月5日-NC最长回文子串的长度
		描述对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度. 方法1:奇数偶数分别从中心扩展 import java.util.*; public c ... 
- 51nod 1088 最长回文子串 【中心拓展法/输出长度和路径】
		1088 最长回文子串 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字 ... 
- leetcode 求一个字符串的最长回文子串
		最长回文子串问题:给定一个字符串,求它的最长回文子串长度.如果一个字符串正着读和反着读是一样的,那它就是回文串. 给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最 ... 
- (转载)Manacher'sAlgorithm: O(n)时间求字符串的最长回文子串
		以下内容转载自:传送门 源于这两篇文章: http://blog.csdn.net/ggggiqnypgjg/article/details/6645824http://zhuhongcheng.wo ... 
- LeetCode之“字符串”:最长回文子串
		题目要求: 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串.例如,给出字符串 "abcdzdcab",它的最长回文子串为 & ... 
- Manarcher  求 字符串 的最长回文子串  【记录】
		声明:这里仅仅写出了实现过程.想学习Manacher的能够看下这里给出的实现过程,算法涉及的一些原理推荐个博客. 给个链接 感觉讲的非常细 引子:给定一个字符串s,让你求出最长的回文子串的长度. 算法 ... 
- 计算字符串的最长回文子串 :Manacher算法介绍
		转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ... 
- Manacher算法讲解——字符串最长回文子串
		引 入 引入 引入 Manachar算法主要是处理字符串中关于回文串的问题的,这没什么好说的. M a n a c h e r 算 法 Manacher算法 Manacher算法 朴素 求一个字符串中 ... 
- 【回文字符串】 最长回文子串O(N) Manacher算法
		原理讲的清晰:Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 注意: ①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯 ②最终 ... 
随机推荐
- classload加载机制
			BootstrapClassLoader.ExtClassLoader.AppClassLoader实际是查阅相应的环境属性sun.boot.class.path.java.ext.dirs和java ... 
- Python学习笔记--高阶技巧(二)
			Socket服务端开发 基本步骤如下: socket客户端开发 基本步骤如下: 1.创建socket对象 2.连接到服务器 3.发送消息 4.接收返回消息 5.关闭连接 正则表达式 基础方法 matc ... 
- java异常--处理机制
			java异常处理机制 异常处理的关键字:try catch finally throw throws package charpter6.Demo02; public class Test { pub ... 
- 基于Vue 使用threejs导入gltf动画模型
			被老师要求学习这个完全不懂的领域的知识,代码东拼西凑终于搞定了,可能写的不好,但这方面的教程很少 某CS**平台的教程都是互相抄,看着烦死. <template> <div id=& ... 
- Chronicle Pro - 一款简单 Mac 理财规划师,管理你的的个人预算
			使用Chronicle追踪和支付账单,管理你的个人预算,这是一款简单的Mac理财规划师.获得通知,这样你就不会错过下一个付款截止日期;你再也不用付滞纳金了.把你所有的账单放在一起,计划.检查和分析它们 ... 
- Flutter中如何取消任务
			前言 在开发过程中,取消需求是很常见的,但很容易被忽略.然而,取消需求的好处也很大.例如,在页面中会发送很多请求.如果页面被切走并处于不可见状态,就需要取消未完成的请求任务.如果未及时取消,则可能会导 ... 
- [Java]排序算法>交换排序>【快速排序】(O(N*logN)/不稳定/N较大/无序/仅顺序存储)
			1 快速排序 1.1 算法思想 快速排序是由冒泡排序改进而得的. 在冒泡排序过程中,只对相邻的2个记录进行比较:因此,每次交换2个相邻记录时,只能消除1个逆序. 若能通过2个(不相邻)记录的1次交换, ... 
- 【Note】(坑)一些组合恒等式的实际意义理解(和待填坑的组合数学知识)
			目录 排列组合 恒等式 (1) \(C_n^m=C_n^{n-m}\) (2) \(A_n^m+mA_n^{m-1}=A_{n+1}^m\) (3) \(C_n^{m-1}+C_n^{m}=C_{n+ ... 
- redis 基于 漏斗算法 实现对 api 的限流
			漏斗算法 漏桶算法的原理: 漏桶有一定的容量,给漏桶注水,当单位时间内注入水量大于流出水量,漏桶内积累的水就会越来越多,直到溢出. 就好比大批量请求访问nginx相当于注水,nginx根据配置按照固定 ... 
- 随手记:Redis 部署到linux上面后,本地无法连接
			修改redis的配置文件 redis.conf 1. bind 设置为 0.0.0.0 2. protected-mode 设置为no (也就是关闭保护模式) 3. daemonize 设置 ... 
