题目
官方解
状态定义:
\[ \begin{align*} & i:\ \text{字符串}s1的第i位\\ & j:\ \text{字符串}s2的第j位\\ & s1[i:]:\ 第i位到末尾的子串\\ & s2[j:]:\ 第j位到末尾的子串\\ & dp[i][j]:\ 表示使字符串s1[i:],s2[j:]从第i位到末尾的子串相等,要删除的ASCII码值最小 \end{align*} \]
状态转移方程:
\[ \begin{align*} dp[i][j] = \begin{cases} & min(dp[i+1][j] + s1.asciiAtPos(i), dp[i][j+1] + s2.asciiAtPos(j))\ & \text{if $s1[i] != s2[j]$ }\\ & df[i-1][j-1]\ &\text{if $s1[i] = s2[j]$} \end{cases} \end{align*} \]
Base case:
\[ \begin{align*} &dp[i][j] = 0 &\text{if $i == 0$ and $j == 0$} \end{align*} \]
Corner case:
\[ dp[i][j] = \begin{cases} & dp[i+1][j] + s1.asciiAtPos(i) & \text{if $s[j:].size() == 0$, 即$j==s1.size()$}\\ & dp[i][j+1] + s2.asciiAtPos(j) & \text{if $s[i:].size() == 0$, 即$i==s1.size()$}\\ \end{cases} \]
C++实现
1 | class Solution { |
Java实现
1 | class Solution { |
总结
- 类似于 最长公共子序列 的一道题。
- 在 二维DP数组初始化的时候,没有考虑到初始化大小为\((m+1)*(n+1)\) .
- 对于\(dp[m][n] = 0\)其实是一种 base case,
- 是考虑到第\(m\)位字符到第\(m\)位字符上的一个情况,即 空串情况。