算法 - 动规13 总结篇(Swift版本)

9 阅读1分钟

题目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]
    }
}

总结一下

随想录总结篇 很全面,按照下面的题目总结进行复习即可。

image.png