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

题目内容

题目要求:给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和。

在这里插入图片描述

解题思路


解题思路:此题为为最长公共子序列的变形

  • 定义:s1[0..i-1]s2[0..j-1]的最小ascii码删除和dp[i][j]
  • 目标:s1[0..m-1]s2[0..n-1] 的最小ascii码删除和,即 dp[m][n]
  • base case: dp[0][..] 对应的(有长度的)字符串ascii码的和,因为如果一个字符串为空,另一个字符串必然要被全部删除,所以需要计算另一个字符串所有字符的 ASCII 码之和。

代码实现

class Solution {
    public int minimumDeleteSum(String s1, String s2) {
        int m=s1.length(),n=s2.length();
        int [][]dp=new int[m+1][n+1];
        //定义时dp的0为basecase状态,意味着这个字符串是空串没有长度,所以另一个字符串必然要被全部删除,需要计算另一个字符串所有字符的 ASCII 码之和。
        //dp这个二维数组的1才是对应着实际字符串的第零位,注意区分相当于逻辑位置和实际位置
        for(int i=1;i<=m;i++)
        {
            //0意味着字符串是空的
            dp[i][0]=dp[i-1][0]+s1.charAt(i-1);
        }
        for(int i=1;i<=n;i++)
        {
            dp[0][i]=dp[0][i-1]+s2.charAt(i-1);
        }
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                // s1[i] 和 s2[j] 都是在 lcs 中的,不用删除
                if(s1.charAt(i-1)==s2.charAt(j-1)) dp[i][j]=dp[i-1][j-1];
                else{
                    // s1[i] 和 s2[j] 至少有一个不在 lcs 中,删一个,加上他的ascii,码的和, 选择最小的作为我们的dp[i][j];
                    //dp中的i对应着实际字符串的i-1
                    //dp[i][j - 1]+s2.charAt(j-1) 即因为 s1[i-1] 和 s2[j-1]不相等,所以我们去考虑dp[i][j - 1]加上s2中第j个字符ascii码的情况
                    dp[i][j]=Math.min(dp[i][j - 1]+s2.charAt(j-1), dp[i - 1][j]+s1.charAt(i-1));
                }
            }
        }
        return dp[m][n];
    }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值