zoukankan      html  css  js  c++  java
  • 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/)

  • 相关阅读:
    java基础之java今生前世
    java线程的方便调用方式
    await和async更多的理解
    asp.net mvc webapi 实用的接口加密方法
    微信小程序开发心得
    为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇
    微软常用的组件设计思想-‘工厂的工厂类’
    尝试asp.net mvc 基于controller action 方式权限控制方案可行性
    cookie 和session 详解
    sql注入详解
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14383019.html
Copyright © 2011-2022 走看看