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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 经典动态规划之编辑距离问题 -> 正文阅读

[数据结构与算法]经典动态规划之编辑距离问题

题目描述

给定两个字符串str1和str2,再给定三个代价:ic、dc、rc,分别代表插入、删除、替换一个字符的代价,
现在,请你求出将str1编辑成str2的最小代价。

思路分析

此题是经典的动态规划题目,每年必考,因此,就不写暴力递归算法了,简单介绍一下递归思路,就直接上动态规划代码了,背也要背下来。
递归思路:
基本思路还是根据位置递归,比如,str1当前在i位置,str2当前在j位置,然后,递归返回的就是str1前i个位置转换成str2前j个位置的最小代价。
因此,递归出口就是str的i等于0时和str2的j等于0时,分别代码从空字符串转换成str2的代价和str1转换成空串的代价,分别就是str2的长度乘以插入和str1的长度乘以删除。
递归函数
观察题目的几种可能性:
1,插入
当str1的0到i位置等于str2的0到j-1位置,说明,str1就算加上i位置也不够,此时需要插入代价
2,删除
当str1的0到i-1位置等于str2的0到j位置时,说明当前str1的i位置多余,需要删除代价
3,替换
当str1的0到i-1位置等于str2的0到j-1位置时,说明前面对上了,此时,需要替换str1的i位置等于str2的j位置,需要替换代价
4,不需要代价
当str1的0到i-1位置等于str2的0到j-1位置时,说明前面对上了,此时,如果str1的i位置等于str2的j位置,则不需要操作
动态规划思路
有了前面的递归的思路,直接上动态规划思路:
先搞一张二维表,行是str1的i,列是str2的j,然后,先把第一行和第一列填上,然后,根据上面的递归关系填满动态规划表。

代码

    public static int f4(String str1,String str2,int ic,int dc,int rc){
        if(str1==null||str2==null){
            return 0;
        }
        char[] chars1=str1.toCharArray();
        char[] chars2=str2.toCharArray();
        int row=chars1.length+1;
        int col=chars2.length+1;
        int[][] dp=new int[row][col];
        for (int i = 1; i < row; i++) {
            dp[i][0]=dc+i;
        }
        for (int j = 1; j < col; j++) {
            dp[0][j]=ic+j;
        }

        for (int i = 1; i < row; i++) {
            for (int j = 1; j < col; j++) {
                //当i和j位置相等时,情况3和4谁先胜,谁先给dp[i][j]赋值
                if(chars1[i-1]==chars2[j-1]){
                    dp[i][j]=dp[i-1][j-1];
                }else {
                    dp[i][j]=dp[i-1][j-1]+rc;
                }
                //然后dp[i][j]依次和后面对比,找出最小的
                dp[i][j]=Math.min(dp[i][j],dp[i][j-1]+ic);
                dp[i][j]=Math.min(dp[i][j],dp[i-1][j]+dc);
            }
        }
        return dp[row-1][col-1];
    }
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:44:57  更:2021-07-24 11:47:00 
 
开发: 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/25 16:20:56-

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