712. 两个字符串的最小ASCII删除和

712. 两个字符串的最小ASCII删除和

给定两个字符串s1s2,返回 使两个字符串相等所需删除字符的 ASCII 值的最小和

示例 1:

输入: s1 = "sea", s2 = "eat"
输出: 231
解释: 在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。
在 "eat" 中删除 "t" 并将 116 加入总和。
结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。

示例 2:

输入: s1 = "delete", s2 = "leet"
输出: 403
解释: 在 "delete" 中删除 "dee" 字符串变成 "let",
将 100[d]+101[e]+101[e] 加入总和。在 "leet" 中删除 "e" 将 101[e] 加入总和。
结束时,两个字符串都等于 "let",结果即为 100+101+101+101 = 403 。
如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。








.............................................................................................................................................................

思路

  1. 当字符串s1的第i个字符与字符串s2的第j个字符相同时,最小和f( i ,j ) 等同于s1的前i-1个字符与s2的前j-1个字符的最小和 f( i-1, j-1).

F ( i , j ) = F ( i − 1 , j − 1 ) , s 1 [ i ] = = s 2 [ j ] F(i,j) = F(i-1,j-1) , \quad\quad\quad s1[i] == s2[j] F(i,j)=F(i1,j1),s1[i]==s2[j]

​ 2.当字符串s1的第i个字符与字符串s2的第j个字符不相同时,有两种操作:

  • 通过在s1末尾删除第i个字符,此时使用s1的第i-1个字符与s2的第j个字符比较,最小和等同于s1的前i个字符与s2的前j-1个字符的操作数 f( i-1, j) + s1(i).

  • 通过在s2末尾删除第j个字符,此时使用s1的第i个字符与s2的第j-1个字符比较,最小和等同于s1的前i-1个字符与s2的前j个字符的操作数 f( i, j-1) + s2(j).

​ 此时最小和等于以上两种操作中最小的最小和

F ( i , j ) = m i n { F ( i − 1 , j ) + s 1 ( i ) , 删除 s 1 的第 i 个字符 F ( i , j − 1 ) + s 2 ( j ) , 删除 s 2 的第 j 个字符 F(i,j) = min \begin{cases} F(i-1,j)+s1(i) , \quad\quad\quad\quad\quad 删除s1的第i个字符\\ F(i,j-1)+s2(j),\quad\quad\quad\quad\quad 删除s2的第j个字符\\ \end{cases} F(i,j)=min{F(i1,j)+s1(i),删除s1的第i个字符F(i,j1)+s2(j),删除s2的第j个字符
C++ 代码:

int minimumDeleteSum(string s1, string s2) {
    int n = s1.size();
    int m = s2.size();
	
    vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
	
    //初始化
    for (int i = 1; i <= m; i++)
        dp[i][0] = dp[i - 1][0] + s2[i - 1];

    for (int j = 1; j <= n; j++)
        dp[0][j] = dp[0][j-1] + s1[j - 1];
	
    //dp填表
    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (s1[j - 1] == s2[i - 1])
                dp[i][j] = dp[i - 1][j - 1];
            else
                dp[i][j] = (dp[i][j - 1] + s1[j - 1]) < (dp[i - 1][j] + s2[i - 1]) ? 
                (dp[i][j - 1] + s1[j - 1]) : (dp[i - 1][j] + s2[i - 1]);
        }
    }
    return dp[m][n];

}
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 起泡法和选择法都是常见的排序算法,可以用来将字符串按照ASCII码值从小到大排列。 起泡法是一种交换排序算法,它通过不断比较相邻的元素并交换位置来达到排序的目的。具体实现时,从第一个元素开始,依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换它们的位置。这样一趟比较下来,最大的元素就会被交换到最后面。然后再从第一个元素开始,重复上述操作,直到所有元素都排好序为止。 选择法也是一种交换排序算法,它的基本思想是每次从未排序的元素中选择最小的元素,然后将它放到已排序的元素的末尾。具体实现时,从第一个元素开始,依次遍历所有未排序的元素,找到其中最小的元素,然后将它与第一个未排序的元素交换位置。然后从第二个未排序的元素开始,重复上述操作,直到所有元素都排好序为止。 使用起泡法和选择法将字符串ASCII码值从小到大排列的具体实现方法如下: 起泡法: 1. 将字符串转换为字符数组。 2. 从第一个字符开始,依次比较相邻的两个字符,如果前面的字符的ASCII码值比后面的字符的ASCII码值大,则交换它们的位置。 3. 重复上述操作,直到所有字符都排好序为止。 选择法: 1. 将字符串转换为字符数组。 2. 从第一个字符开始,依次遍历所有未排序的字符,找到其中ASCII码值最小的字符,然后将它与第一个未排序的字符交换位置。 3. 从第二个未排序的字符开始,重复上述操作,直到所有字符都排好序为止。 以上就是使用起泡法和选择法将字符串ASCII码值从小到大排列的方法。 ### 回答2: 字符串是由字符组成的有限序列,每个字符都有其对应的ASCII码值。将字符串按照ASCII码值从小到大排列是一种常见的需求。下面将介绍两种排序方法:起泡法和选择法。 起泡法,又称冒泡排序,是一种简单的排序算法。其基本思想是:在待排序的数列中从前往后依次比较相邻的两个数,如果前一个数大于后一个数,则交换它们的位置。经过第一轮比较后,可以将最大的数移到数列的末尾;再从前往后依次比较相邻的数,完成第二轮排序;以此类推,直到排序完成。 下面是使用起泡法对字符串进行排序的方法: 1. 将待排序的字符串转为字符数组。 2. 从前往后依次比较相邻的两个字符,如果前一个字符的ASCII码值大于后一个字符,则交换它们的位置。 3. 进行第一轮比较后,可以将ASCII码值最小的字符移到字符数组的最前面。 4. 再从前往后依次比较相邻的字符,完成第二轮排序。 5. 以此类推,直到排序完成。 选择法,又称简单选择排序,是一种基于比较的排序算法。其基本思想是:在待排序的数列中选择最小的一个数,将其放置在数列的最前面;再从剩余的数列中选择最小的一个数,将其放置在已排序的数列后面;依此类推,直到所有数都被排序。 下面是使用选择法对字符串进行排序的方法: 1. 将待排序的字符串转为字符数组。 2. 在未排序部分找到ASCII码值最小的字符,将该字符与未排序部分的第一个字符交换。 3. 将已排序部分扩展一个字符,再次在未排序部分找到ASCII码值最小的字符,将该字符与未排序部分的第一个字符交换。 4. 以此类推,直到所有字符都被排序。 总结:起泡法和选择法都是基于比较的简单排序算法,只适用于小规模数据排序。相对而言,起泡法的交换过程较多,而选择法的交换过程相对较少,因此选择法的效率稍高一些。但是对于大规模数据排序,需要使用更加高效的排序算法。 ### 回答3: 字符串ascii码值从小到大排列,通常可以采用两种排序方法,即起泡法和选择法。 起泡法是一种比较简单的排序方法,其基本思想是从第一个元素开始,依次比较相邻的两个元素的大小,如果前面的元素大于后面的元素,则将它们的位置交换。这样一趟比较下来,最大的元素就会浮到最后。接着再从头开始比较,依次将未排序的元素中最大的元素移到最后,直到所有元素都排序好。 使用起泡法对字符串ascii码值从小到大排列可以按以下步骤进行: 1. 将字符串按照字符的ascii码值转换成一个整数数组。 2. 从数组的第一个元素开始,依次比较相邻的两个元素,如果前面的元素大于后面的元素,则将它们的位置交换。 3. 重复步骤2,直到所有元素都排序好。 选择法也是一种比较常用的排序方法,基本思想是依次找出未排序数列中的最小元素,并将其移动到数列的起始位置。接着从剩余未排序的数列中继续寻找最小元素,并将其放在已排序数列的末尾,直到所有元素都排序好。 使用选择法对字符串ascii码值从小到大排列可以按以下步骤进行: 1. 将字符串按照字符的ascii码值转换成一个整数数组。 2. 从数组的第一个元素开始,设其为最小值。 3. 依次扫描数组中剩余未排序的元素,找出其中最小的元素,并记录其下标。 4. 如果最小元素不在数组的起始位置,将最小元素与起始位置的元素交换。 5. 重复步骤3~4,直到所有元素都排序好。 无论是起泡法还是选择法,它们的时间复杂度都是O(n^2),所以对于大规模的数据排序效率并不高,建议采用更高效的排序算法,如归并排序或快速排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值