問題: git
方法: 算法的核心是動態規劃,從短串推導到長串,當s[i] = s[j]時,dp[i][j] = dp[i+1][j-1] + 2;當 s[i] = s[j]時,dp[i][j] = maxOf(dp[i+1][j], dp[i][j-1]),相似斐波那契數列的演算過程,最後輸出dp[0][s.lastIndex]即爲最終結果。github
具體實現:算法
class LongestPalindromicSubsequence {
fun longestPalindromeSubseq(s: String): Int {
if (s.isEmpty()) {
return 0
}
val dp = Array(s.length) { Array(s.length) { 0 } }
for (i in s.lastIndex downTo 0) {
dp[i][i] = 1
for (j in (i + 1)..s.lastIndex) {
if (s[i] == s[j]) {
dp[i][j] = dp[i+1][j-1] + 2
} else {
dp[i][j] = maxOf(dp[i+1][j], dp[i][j-1])
}
}
}
return dp[0][s.lastIndex]
}
}
fun main(args: Array<String>) {
val input = "bbbab"
val longestPalindromicSubsequence = LongestPalindromicSubsequence()
println(longestPalindromicSubsequence.longestPalindromeSubseq(input))
}
複製代碼
有問題隨時溝通bash