leetcode刷题笔记 214题 最短回文串

leetcode刷题笔记 214题 最短回文串

源地址:214. 最短回文串

问题描述:

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

示例 1:

输入: "aacecaaa"
输出: "aaacecaaa"
示例 2:

输入: "abcd"
输出: "dcbabcd"

//主要算法使用马拉车算法,相关知识详见第五题
//通过马拉车算法获取中心位置及最长回文子串
//由于回文串的构成是在左侧进行补充,故获取中心位置后,将其后侧部分复制颠倒相连即可
object Solution {
    def shortestPalindrome(s1: String): String = {
        var length = 0
        var pos = 0
        var mx = 0
        var end = 0
        
        //manacher prepare
        if (s1.length == 0 || s1.length == 1) return s1
        var sS = "^#"
        s1.foreach(x  => sS += x + "#")
        sS += "$"
        val arr = Array.fill(sS.length)(0)
        println("sS: " + sS)
        
        for (i <- 1 to sS.length-2) {
            if (i < mx) arr(i) = Math.min(arr(2 * pos - i), mx - i)
            else arr(i) = 1
            while (sS(i + arr(i)) == sS(i - arr(i))) arr(i) += 1
            if (arr(i) + i > mx){
                mx = arr(i) + i
                pos = i
            }
            if (arr(i) == i) end = i 
        }
        val res = (sS.substring(end+1, sS.length-2).reverse + sS.substring(end, sS.length-2)).split('#').mkString
        return res
    }
}
posted @ 2020-09-30 23:37  ganshuoos  阅读(122)  评论(0编辑  收藏  举报