链接:https://leetcode-cn.com/problems/minimum-ascii-delete-sum-for-two-strings/
最长公共子序列问题的变体,用动态规划解决。创建二维数组
d
p
dp
dp,
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示两个字符串分别取$[0,i) $与
[
0
,
j
)
[0,j )
[0,j)的子串时的最小ASCII删除和。
若
s
1
[
i
−
1
]
=
=
s
2
[
j
−
1
]
s_1[i-1]==s_2[j-1]
s1[i−1]==s2[j−1],
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
−
1
]
dp[i][j]=dp[i-1][j-1]
dp[i][j]=dp[i−1][j−1]
若
s
1
[
i
−
1
]
!
=
s
2
[
j
−
1
]
s_1[i-1]!=s_2[j-1]
s1[i−1]!=s2[j−1],
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
]
[
j
−
1
]
+
s
1
[
i
−
1
]
,
d
p
[
i
−
1
]
[
j
]
+
s
2
[
j
−
1
]
)
dp[i][j] = min(dp[i][j-1]+s_1[i-1],dp[i-1][j]+s_2[j-1])
dp[i][j]=min(dp[i][j−1]+s1[i−1],dp[i−1][j]+s2[j−1])
java代码:
class Solution {
public int minimumDeleteSum(String s1, String s2) {
int dp[][] = new int [s1.length()+1][s2.length()+1];
dp[0][0] = 0;
for(int i = 1;i<=s1.length();i++)
{
dp[i][0] = dp[i-1][0]+s1.charAt(i-1);
}
for(int j = 1;j<=s2.length();j++)
{
dp[0][j] = dp[0][j-1]+s2.charAt(j-1);
}
for(int i = 1;i<=s1.length();i++)
{
for(int j = 1;j<=s2.length();j++)
{
if(s1.charAt(i-1)==s2.charAt(j-1))
dp[i][j] = dp[i-1][j-1];
else
dp[i][j] = Math.min(dp[i][j-1]+s2.charAt(j-1),dp[i-1][j]+s1.charAt(i-1));
}
}
return dp[s1.length()][s2.length()];
}
}
本文介绍如何使用动态规划解决两个字符串的最小ASCII删除和问题。通过构建二维数组dp,记录两个字符串在不同截断点上的最小ASCII删除和,最终得出整体最优解。文章详细解释了状态转移方程,并提供了完整的Java代码实现。
921

被折叠的 条评论
为什么被折叠?



