# 가장긴 회문

타임리밋 걸림...

import "fmt"

func Reverse(s string) (result string) {
  for _,v := range s {
    result = string(v) + result
  }
  return 
}

func GetPalindrome(l int, r int, origin string, prePalLength int) string {
    var palindrome string
    
    if r - l == 2 {
        palindrome = string(origin[l + 1])
    }
    
    // if prePalLength != 0 {
    //     start, end := l, r
    //     l -= prePalLength / 2
    //     r += prePalLength / 2
    //     if origin[l:start + 1] == Reverse(origin[end: r + 1]) {
    //         palindrome = origin[l:r + 1]
    //     }
    // }
    
    for l >= 0 && r < len(origin) {
        fmt.Println(string(origin[l]), l, string(origin[r]), r, palindrome)
        if origin[l] == origin[r] {
            palindrome = string(origin[l]) + palindrome + string(origin[r])
            l--
            r++
            continue
        } else {
            break
        }
    }
    
    return palindrome
}

func longestPalindrome(s string) string {
    i := 0
    j := 1
    curPalindrome := ""

    for j < len(s) {
        if s[i] == s[j] {
            newPalindrome := GetPalindrome(i, j, s, len(curPalindrome))
            if len(newPalindrome) > len(curPalindrome)  {
                curPalindrome = newPalindrome
            }
        }
        if j - i == 1 {
            j++
        } else if j - i == 2 {
            i++
        }
    }
    if curPalindrome == "" {
        return string(s[0])
    }
    return curPalindrome
}

O(n^2) 알고리즘

func GetPalindromeLength(l int, r int, origin string) int {
    for l >= 0 && r < len(origin) && origin[l] == origin[r] {
        l--
        r++
    }
    
    return r - l - 1 // 2n - 1
}

func longestPalindrome(s string) string {
    if s == "" || len(s) < 1 {
        return ""
    }
    
    end, start := 0, 0
    length := 0

    for i := 0; i < len(s); i++ {
        leng1, leng2 := GetPalindromeLength(i, i, s), GetPalindromeLength(i, i + 1, s)
        if leng1 < leng2 {
            length = leng2
        } else {
            length = leng1
        }
        if length > end - start {
            start = i - (length - 1) / 2 // index 0부터 시작하기 때문에 - 1
            end = i + length / 2
        }
    }
    
    return s[start: end + 1]
}
© Devlog from jeong