算法题目: 动态规划 之 最短编辑距离

问题:

对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一个定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离。对于给定的字符串A和B,设计一个算法,计算其扩展距离。

测试数据:

输入:cmc      snmn        2       (分别表示字符串A、B和定值k)

输出:10

输入:cdd      snmn        1       (分别表示字符串A、B和定值k)

输出:7

输入:cd      ad        1       (分别表示字符串A、B和定值k)

输出:2



//当场没做出来,汗颜啊

//回来查了下,原来是动态规划

//JAVA实现了一下:

import static java.lang.Math.abs;
import static java.lang.Math.min;
public class DPString {
    public static int MAX_LEN = 2014;
    public static int work(char str1[], char str2[], int k) {
        int[][] dp = new int[MAX_LEN][MAX_LEN];
        int length1 = str1.length;
        int length2 = str2.length;
        dp[0][0] = 0;
        for (int i = 1; i <= length1; i++) {
            dp[i][0] = i * k;
        }
        for (int i = 1; i <= length2; i++) {
            dp[0][i] = i * k;
        }
        for (int i = 1; i <= length1; i++) {
            for (int j = 1; j <= length2; j++) {
                dp[i][j] = min(dp[i - 1][j - 1] + abs(str1[i - 1] - str2[j - 1]), min(dp[i - 1][j], dp[i][j - 1]) + k);
            }
        }
        return dp[length1][length2];
    }
    public static void main(String[] args) {
        String stra = "cdd";
        String strb = "snmn";
        int k = 1;
        System.out.println(work(stra.toCharArray(), strb.toCharArray(), k));// output 7
    }
}

算法题目: 动态规划 之 最短编辑距离

时间: 2024-12-19 20:28:38

算法题目: 动态规划 之 最短编辑距离的相关文章

最短编辑距离算法

一般情况下,电商在当客户输入一个不存在的商品时,会返回客户一个与客户输入最为接近的商品,并加以提示"您是不是在找XXX?".这其中用到了一种算法,叫做"最短编辑距离算法",能在一大堆已存在的字符串中找到与原字符串最为接近的那个字符串,称之为最短编辑距离. 这种算法是基于动态规划思想,下面是算法的思路描述: 描述: 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: (1)删除一个字符; (2)插入一个字符: (3)将一个字符改

最短编辑距离算法实现

一,算法介绍 在CS124课程的第一周提到 求解两个字符串相似度的算法---Minimum Edit Distance(最短编辑距离)算法.该算法在NLP(自然语言处理)中也会用到. 如何定义相似度呢?任给两个字符串X 和Y,使用以下三种操作将 字符串X 变到 字符串Y  :①插入(Insert)操作:②删除操作(delete):③替换操作(substitute) 比如 字符串X="intention" ,  字符串Y="execution".从字符串X 转换成 字

最短编辑距离算法(字符串比较)

一.编辑距离 1.从字符串a变为字符串b所需要的元操作有3种: 增加一个字符 删除一个字符 变化一个字符 2.编辑距离:从字符串a变为b所需要的最少操作步骤. 二.最短编辑距离(动态规划) 首先定义一个函数--step(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离. 显然可以有如下动态规划公式: if i == 0 且 j == 0,step(i, j) = 0 if i == 0 且 j > 0,step(i, j) = j if i > 0 且j

算法:动态规划

1.首先来看看维基百科怎么定义的动态规划 引自wiki:Dynamic programming In mathematics, management science, economics, computer science, and bioinformatics, dynamic programming (also known as dynamic optimization) is a method for solving a complex problem by breaking it dow

十大基础实用算法之动态规划

动态规划(Dynamic programming)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法. 动态规划背后的基本思想非常简单.大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解. 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将

算法导论--动态规划(装配线调度)

装配线问题: 某个工厂生产一种产品,有两种装配线选择,每条装配线都有n个装配站.可以单独用,装配线1或2加工生产,也可以使用装配线i的第j个装配站后,进入另一个装配线的第j+1个装配站继续生产.现想找出通过工厂装配线的最快方法. 装配线i的第j个装配站表示为Si,j,在该站的装配时间是ai,j 如果从 Si,j装配站生产后,转移到另一个生产线继续生产所耗费的时间为ti,j 进入装配线花费时间ei,完成生产后离开装配线所耗费时间为xi 令f*表示通过生产所有路线中的最快的时间 令fi[j]表示从入

活动选择问题(贪心算法vs动态规划)

活动选择问题贪心算法vs动态规划 基础知识 1-1动态规划 1-2贪心算法 1-3贪心算法vs动态规划 活动选择问题描述 活动选择问题最优子结构 活动选择问题算法设计 4-1贪心算法之选择最早结束活动 4-1-1递归贪心算法 4-1-2迭代的方式进行 4-2贪心算法之选择最短时长活动 4-3动态规划方法实现 4-3-1自上而下的实现 4-3-2自下而上的实现 结论 活动选择问题(贪心算法vs动态规划) 1.基础知识 在讲解活动选择问题之前,我们首先来介绍一动态规划和贪心算法的基础知识 1-1.动

算法题目积累0721

1,两个字符串的最长公共子串 基本思想是扫描两次矩阵,第一次进行字符比较:第二次找出对角线为1的最长长度 package com.bobo.interview; import com.bobo.util.MetrixPrint; /** * 这个类实现的功能室查找两个字符串的最长公共子串(要求连续) * 扫描两次矩阵,第一次的时候是两个字符串的比较,相等的位置赋值1,不等的位置赋值0 * 第二次扫描,找出对角线为1的最大长度 * 需要注意的是:分支不止一个的情况 * @author weibo.

最短编辑距离问题理解

最短编辑距离是指两个字符串,把其中一个字符串转为另一个字符串所需要花费的最小操作成本. 设dp[i][j]为Xi与Yj的最短编辑距离,则Xi与Yj处于最优解时的排列有三种情况 1.Xi最后一个元素xi位于Yj最后一个元素yj的左边 2.Xi最后一个元素xi位于Yj最后一个元素yj的右边 3.Xi最后一个元素xi与Yj最后一个元素yj重合 无论最终dp[i][j]的字符串如何对齐,只用取三种情况的最小值即可. 对于1,转化操作时,yj是必然要删掉的,故必然有1个单位的操作成本,因为dp[i][j]