IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 编辑距离题目总结 -> 正文阅读

[数据结构与算法]编辑距离题目总结

判断子序列

class Solution {
    public boolean isSubsequence(String s, String t) {
        //dp定义:dp[i][j]为到i-1,j-1最长子序列的长度
        //递推:相等,dp[i][j] = dp[i-1][j-1] + 1;
        //不相等,dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
        int[][] dp = new int[s.length()+1][t.length()+1];
        for(int i = 1;i <= s.length();i++) {
            for(int j = 1;j <= t.length();j++) {
                if(s.charAt(i-1) == t.charAt(j-1)) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                }else {
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        if(dp[s.length()][t.length()] != s.length()) {
            return false;
        }
        return true;
    }
}

不同的子序列
这道题虽然也是删除,但是它和上一道题还不大一样,就是当字符相等的时候,我可以选择用当前字符匹配,也可以选择不用,用的话就是i+1到最后包含j+1到最后,不用就是i+1到最后,j到最后因为当前j不用嘛.时刻记住dp的定义.

class Solution {
    public int numDistinct(String s, String t) {
        //dp数组定义:dp[i][j]表示s[i]到之后包含t[j]到最后的个数
        int[][] dp = new int[s.length()+1][t.length()+1];
        if(s.length() < t.length()) return 0;
        for(int i = 0;i <= s.length();i++) {
            dp[i][t.length()] = 1;
        }
        for(int i = s.length() - 1;i >= 0;i--) {
            char sc = s.charAt(i);
            for(int j = t.length() - 1;j >= 0;j--) {
                char tc = t.charAt(j);
                if(sc == tc) {
                    dp[i][j] = dp[i+1][j+1] + dp[i+1][j];
                }else {
                    dp[i][j] = dp[i+1][j];
                }
            }
        }
        return dp[0][0];
    }
}

两个字符串的删除操作
可以借鉴前几题写一个间接的写法,也能直接写,直接写的话就是递推公式有点变化.

class Solution {
    public int minDistance(String word1, String word2) {
        //这道题本质就是找word1,word2的相同子序列的长度,然后两个中短的一减就行了
        //dp定义:dp[i][j]表示i到后和j到后子序列的长度
        //递推:word1[i] == word2[j]时,dp[i][j] = dp[i+1][j+1] + 1;
        //不一样,dp[i][j] = Math.max(dp[i+1][j],dp[i][j+1]);
        int[][] dp = new int[word1.length() + 1][word2.length() + 1];
        for(int i = word1.length() - 1;i >= 0;i--) {
            char w1 = word1.charAt(i);
            for(int j = word2.length() - 1;j >= 0;j--) {
                char w2 = word2.charAt(j);
                if(w1 == w2) {
                    dp[i][j] = dp[i+1][j+1] + 1;
                }else {
                    dp[i][j] = Math.max(dp[i+1][j],dp[i][j+1]);
                }
            }
        }
        return word1.length() + word2.length() - dp[0][0] * 2;
    }
}

编辑距离
如果想不到用dp的话,这道题容易让人一头雾水,感觉情况很多理不清.但其实它用动规就很清楚了,就是考虑当前两个字符相等的情况,不相等的情况各对应的操作即可,相同不操作,不相同,就是删增替,值得注意的是,word1增就等价于word2减,二者操作数是相同的.

class Solution {
    public int minDistance(String word1, String word2) {
        //dp[i][j]表示以下标i-1的word1,到下标j-1的word2,最短编辑距离
        //递推:word1[i]==word2[j] dp[i][j] = dp[i-1][j-1];
        //word1[i]!=word2[j],有三种情况,删增替
        int[][] dp = new int[word1.length() + 1][word2.length() + 1];
        for(int i = 1;i <= word1.length();i++) dp[i][0] = i;
        for(int j = 1;j <= word2.length();j++) dp[0][j] = j;
        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)) {
                    dp[i][j] = dp[i-1][j-1];
                }else {
                    dp[i][j] = Math.min(dp[i-1][j] + 1,Math.min(dp[i][j-1]+1,dp[i-1][j-1]+1));
                }
            }
        }
        return dp[word1.length()][word2.length()];
    }
}

总之就是dp的定义时刻要牢记,然后分情况写就行了.

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:19:45  更:2022-04-01 00:22:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:54:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码