题目1:647. 回文子串
class Solution {
func countSubstrings(_ s: String) -> Int {
// 直接看题解
// dp数组定义为 查询dp[i][j] 区间的子串是否为回文子串。
// 如果s[i] == s[j], 分为三种情况 i == j, j - i == 1, j - i > 1
var dp = Array(repeating: Array(repeating: false, count: s.count), count: s.count)
var chars = Array(s)
var res = 0
for i in (0..<s.count).reversed() {
for j in i..<s.count {
if chars[i] != chars[j] { dp[i][j] = false }
else {
if j - i <= 1 {
dp[i][j] = true
} else {
dp[i][j] = dp[i + 1][j - 1]
}
}
res += dp[i][j] ? 1 : 0
}
}
return res
}
}
题目2:516. 最长回文子序列
class Solution {
func longestPalindromeSubseq(_ s: String) -> Int {
// 类似于647.回文子串
// 区别在于如果 s[i] == s[j] 直接 dp[i + 1][j - 1] + 2
// 如果不等的时候, 可以选择 dp[i][j - 1] dp[i + 1][j] 里面的大者
var dp = Array(repeating: Array(repeating: 0, count: s.count), count: s.count)
var chars = Array(s)
for i in 0..<s.count { dp[i][i] = 1 }
for i in (0..<s.count).reversed() {
for j in (i + 1)..<s.count {
if chars[i] == chars[j] {
dp[i][j] = dp[i + 1][j - 1] + 2
} else {
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
}
}
}
return dp[0][s.count - 1]
}
}
总结一下
随想录总结篇 很全面,按照下面的题目总结进行复习即可。