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
}
}