1. 程式人生 > 其它 >go 刷演算法第二題——最長迴文子串

go 刷演算法第二題——最長迴文子串

描述

對於一個字串,請設計一個高效演算法,計算其中最長迴文子串的長度。

給定字串A以及它的長度n,請返回最長迴文子串的長度。

示例1

輸入:"abc1234321ab",12
返回值:7

思路: 窮舉所有節點的方案。
滿足條件時,存在以下兩種情況

  1. index節點為對稱軸節點 [...,1,2,1,...]
  2. index節點為對稱軸左邊第一個節點,對稱軸不在節點上 [...,1,1,...]
package main
 
/**
 * 程式碼中的類名、方法名、引數名已經指定,請勿修改,直接返回方法規定的值即可
 *
 * @param A string字串
 * @param n int整型
 * @return int整型
*/
// 最長迴文子串
func getLongestPalindrome(A string, n int) int {
    if n < 2 {
        return 1
    }
    maxLen := 0
    runes := []rune(A)
    for i := 0; i < n; i++ {
        for j := 0; j < i; j++ {
            // 奇  aba
            // 假設當前位置滿足,那麼必須要長度大於已經得到的最大長度才進行賦值
            // 切片不能越界
            // 比較當前位置兩邊的等長切片是否滿足對稱陣列
            if maxLen < 2*(i-j)+1 && 2*i-j+1 <= n && isT(runes[j:i], runes[i+1:2*i-j+1]) {
                maxLen = 2*(i-j) + 1
            }
            // 偶  abba
            if maxLen < 2*(i-j) && 2*i-j <= n && isT(runes[j:i], runes[i:2*i-j]) {
                maxLen = 2 * (i - j)
            }
        }
    }
    return maxLen
}
 
// a、b是否為對稱陣列,[1,2,3]與[3,2,1]對稱
func isT(a []rune, b []rune) bool {
    arrLength := len(a)
    for i, j := 0, arrLength-1; i < arrLength; i, j = i+1, j-1 {
        if a[i] != b[j] {
            return false
        }
    }
    return true
}