首页 > 其他分享 >583. 两个字符串的删除操作(leetcode)

583. 两个字符串的删除操作(leetcode)

时间:2024-09-10 21:49:29浏览次数:1  
标签:LCS 583 int word1 word2 字符串 510 leetcode String

https://leetcode.cn/problems/delete-operation-for-two-strings/solutions/

两种做法,1.直接dp 2.转换题意,思考成LCS

class Solution {
    public int minDistance(String word1, String word2) {
        // 编辑距离的简化版
        // f[i][j]表示word1前i个字符中选择,word2前j个字符中选择得到相同的最小步数
        // 以word1[i],word2[j]是否相同来划分子集
        // 相同意味着这个两个字符都不需要被删除,无需操作,则考虑之前的
        // 不同意味着考虑删除一个字符,但是选择删word1[i]还是word2[j],来划分子集

        // f[i][j] = if(word1[i]==word2[j]) f[i-1][j-1]
        //           else Math.min(f[i-1][j],f[i][j-1])+1
        // 初始化根据f定义,f[1~n][0]=1~n,f[0][1~n]=1~n,即有多少删多少,删成空串
        int[][] f=new int[510][510];
        for(int i=1;i<=word1.length();i++)f[i][0]=i;
        for(int i=1;i<=word2.length();i++)f[0][i]=i;
        for(int i=1;i<=word1.length();i++)
            for(int j=1;j<=word2.length();j++)
            {
                if(word1.charAt(i-1)==word2.charAt(j-1))f[i][j]=f[i-1][j-1];
                else f[i][j]=Math.min(f[i-1][j],f[i][j-1])+1;
            }
        return f[word1.length()][word2.length()];
    }
}
class Solution {
    public int minDistance(String word1, String word2) {
        // 编辑距离的简化版,考虑使用最长公共子序列做
        // 题意等同于word1,word2都是最长公共子序列时拥有最大的长度,因此步数是最小的
        // 答案是:abs(word1.length-LCS)+abs(word2.length-LCS)
        // 
        int[][] f=new int[510][510];
        // f[0~1][0~1]全都无需初始化,因为对应f定义就是0
        for(int i=1;i<=word1.length();i++)
        {
            for(int j=1;j<=word2.length();j++)
            {
                if(word1.charAt(i-1)==word2.charAt(j-1))f[i][j]=f[i-1][j-1]+1;
                else f[i][j]=Math.max(f[i-1][j],f[i][j-1]);
            }
        }
        int LCS=f[word1.length()][word2.length()];
        return Math.abs(word1.length()-LCS)+Math.abs(word2.length()-LCS);
    }
}

 

标签:LCS,583,int,word1,word2,字符串,510,leetcode,String
From: https://www.cnblogs.com/lxl-233/p/18407275

相关文章

  • LeetCode Hot100刷题记录-234.回文链表
    题目:给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。PS:回文序列是向前和向后读都相同的序列。解题思路:遍历链表,将每个元素存放入一个新的数组中。遍历完成后,再用两个指针前后遍历数组来判断两个数字是否相等。/***Def......
  • 线性dp:LeetCode122.买卖股票的最佳时机ll
    买卖股票本文所讲解的内容与LeetCode122.买卖股票的最佳时机ll,这道题题意相同,阅读完本文后可以自行挑战一下力扣链接题目叙述:给定一个长度为N的数组,数组中的第i个数字表示一个给定股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交......
  • 394. 字符串解码
    题目链接394.字符串解码思路字符串模拟;出现相同子问题,可以使用递归或者栈解决题解链接字符串解码(辅助栈法/递归法,清晰图解)关键点栈:需要存储(重复次数,当前字符串);递归:需要范围内嵌字符串及结束位置时间复杂度\(O(n)\)空间复杂度\(O(n)\)代码实现(栈......
  • leetcode day06 动态规划之解码方法I和II
    91.解码方法该题类似于爬楼梯方法一:动态规划对于给定的字符串s,设它的长度为n,其中的字符从左到右依次为s[1],s[2],⋯,s[n]。我们可以使用动态规划的方法计算出字符串s的解码方法数。具体地,设f i 表示字符串s的前i个字符s[1..i]的解码方法数。在进行状态转移......
  • LeetCode之数组/字符串
    88.合并两个有序数组classSolution{publicvoidmerge(int[]nums1,intm,int[]nums2,intn){//这个循环将nums2中的元素逐个复制到nums1中从索引m开始的位置for(inti=0;i<n;i++){nums1[i+m]=nums2[i];......
  • LeetCode: 2552. 统计上升四元组 动态规划 时间复杂度O(n*n)
    2552.统计上升四元组today2552.统计上升四元组题目描述给你一个长度为n下标从0开始的整数数组nums,它包含1到n的所有数字,请你返回上升四元组的数目。如果一个四元组(i,j,k,l)满足以下条件,我们称它是上升的:0<=i<j<k<l<n且nums[i]<nums[k]<num......
  • python-字符串
    1.在python中,字符串是被定义为在引号(或双引号)之间的一组连续的字符。这个字符可以是键盘上所有可见字符,也可以是不可见的“回车符” “制表符”等。字符串的操作方法很多,这里只选出最典型的几种。(1)字符串大小写转换》S.lower():字母大写转换成小写。》S.upper():字母小写转......
  • 115. 不同的子序列(leetcode)
    https://leetcode.cn/problems/distinct-subsequences/submissions/563375885/这题比较有难度,具体不太好想到,需要以是否选择s[i]来划分子集这位描述的很清楚,不做过多赘述classSolution{publicintnumDistinct(Strings,Stringt){//f[i][j]表示s中前i个......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【回溯】2024E-字符串
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路代码pythonjavacpp时空复杂度华为OD算法/大厂面......
  • 字符串类
    String类的特性String类是一个final类,不能被继承String类底层是一个final修饰的字符数组,表示不可变的字符序列(finalcharvalue[])String的不可变性:当String值改变时,会在常量池中创建新的字符串字符串-创建字面量方式创建Strings1="abc";//s1存储的是常量池中"abc......