问题描述:
Given two strings s1, s2
, find the lowest ASCII sum of deleted characters to make two strings equal.
给两个字符串,删除字符串的字符,直到两个字符串相同,算出减去的字符的ASC码的和的最小值
问题解决:
使用动态规划,找到递推式,用a[i][j]表示s1前i个,s2前j个减到相同的最小ASC码值
到达a[i][j]有三种情况
a[i-1][j]+s1[i],即加上s1第i个的代价
a[i][j-1]+s2[j],即加上s2第j个的代价
若s1[i]==s2[j] 则为a[i-1][j-1],否则为a[i-1][j-1]+s1[i]+s2[j],即加上s1[i]和s2[j]的代价
a[i][j]即为以上三种情况最小的ASC码值
最后的结果为a[len1][len2]的值
代码如下:
class Solution {
public:int minimumDeleteSum(string s1, string s2) {
int i, j;
int a[1001][1001];
int len1 = s1.length();
int len2 = s2.length();
//初始化a
for(i = 1; i < len1+1; i++) {
a[i][0] = a[i-1][0] + s1[i-1];
}
for(i = 1; i < len2+1; i++) {
a[0][i] = a[0][i-1] + s2[i-1];
}
//根据递推式算出子问题
for(i = 1; i < len1+1; i++) {
for(j = 1; j < len2+1; j++) {
//算出三种情况的值
int c1 = a[i-1][j] + s1[i-1];
int c2 = a[i][j-1] + s2[j-1];
int c3 = s1[i-1] == s2[j-1] ? a[i-1][j-1] : a[i-1][j-1] + s1[i-1] + s2[j-1];
//取最小值
c1 = c1 < c2 ? c1 : c2;
c1 = c1 < c3 ? c1 : c3;
//赋值
a[i][j] = c1;
}
}
return a[len1][len2];
}
};