计算字符串编辑距离

计算字符串编辑距离

题目描述:给定两个字符串,要求二者之间的编辑距离。

分析:字符串的编辑主要有三种方式:增加、删除和修改。这道题目按照递归的方式,逐个判断每个字符。具体而言,如果str1和str2的第一个字符相等,则往后移,编辑的距离为后续的字符串;如果第一个不等,则我们可以增加、删除和修改str1,也可以增加、删除和修改str2,还可以同时增加、删除和修改str1和str2。不管以何种方式修改哪一个字符串,这个编辑距离都+1.

代码如下:

#include<iostream>
#include<string>
using namespace std; 

int stringEditDistance(string str1, int begin1, int end1, string str2, int begin2, int end2)
{
    if(begin1 > end1)
    {
        if(begin2 > end2)
            return 0;
        else
            return end2 - begin2 + 1;
    }

    if(begin2 > end2)
    {
        if(begin1 > end1)
            return 0;
        else
            return end1 - begin1 + 1;
    }

    if(str1[begin1] == str2[begin2])
    {
        return stringEditDistance(str1, begin1+1, end1, str2, begin2+1, end2);
    }
    else
    {
        int dis1 = stringEditDistance(str1, begin1+1, end1, str2, begin2+2, end2);
        int dis2 = stringEditDistance(str1, begin1+2, end1, str2, begin2+1, end2);
        int dis3 = stringEditDistance(str1, begin1+2, end1, str2, begin2+2, end2); 

        if(dis1 <= dis2 && dis1 <= dis3)
            return dis1 + 1;
        if(dis2 <= dis1 && dis2 <= dis3)
            return dis2 + 1;
        if(dis3 <= dis2 && dis3 <= dis1)
            return dis3 + 1;
    }
}

int main()
{
    string str1 = "ABCDE";
    string str2 = "ADBBDE"; 

    cout<<stringEditDistance(str1, 0, str1.length(), str2, 0, str2.length())<<endl; 

    return 0;
}

参考:

《编程之美》

时间: 2024-07-30 10:23:40

计算字符串编辑距离的相关文章

利用Trie树求多个字符串编辑距离的进一步优化

1.引言 题目的意思应该是:在一个给定的字典中,求与给定的字符串的编辑距离不大于2的所有的单词.原先写过两片关于此问题的文章,那两片篇章文章给出两种解决思路:其一是暴力求解法,这种方法最容易想到.就是将词典中的词一一与给定的字符串计算编辑距离,不大于2的输出,大于2的舍弃,这种方法思路简单但是很费时间.其二根据词典中这些词之间的编辑距离建立一个以单词为节点的Trie树,遍历的时候,通过计算根节点与给定字符串的编辑距离就可以排除掉一部分分支了,然后继续计算该字符串与剩余的分支的根的编辑距离,继续排

最长递增子序列 &amp;&amp; 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

http://www.cppblog.com/mysileng/archive/2012/11/30/195841.html 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增子序列. 设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为: dp[i] = max{dp[j]+1}, 1<=j<i,a[j]<a[i]. 这样简单的复杂度为O(n^2),其实还有更好的方

[算法]字符串编辑距离

来自编程之美的一题 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程序.我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”); 2.增加一个字符(如把“abdd”变为“aebdd”); 3.删除一个字符(如把“travelling”变为“traveling”); 比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的.上面的两种方案,都仅需要一 次

编程之美3.3—计算字符串的相似度

题目: 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程序.我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把"a"替换为"b"); 2.增加一个字符(如把"abdd"变为"aebdd"); 3.删除一个字符(如把"travelling"变为"traveling"); 比如,对于"abcdefg"和

算法学习(十二)最大连续乘积子串、字符串编辑距离

最大连续乘积子串 题目描述:给一个浮点数序列,取最大乘积连续子串的值,例如-2.5,4,0,3,0.5,8,-1,则取出的最大乘积子串为3,0.5,8.也就是说,上述数组中,3,0.5,8这3个数的乘积3*0.5*8 = 12是最大的,而且是连续的. 分析: 注意子串和字序列的区别. 子串:是串的连续的部分. 子序列:是串中不改变顺序,但是是去掉个别元素的到新的序列. 1,连续数的乘积,最简单的就是穷举法,就是区间[i-j]之间的数的乘积,和最大值max比较,最后输出max.但是时间复杂度很大几

一本通 1298:计算字符串距离

计算字符串距离 同样也是字符串距离计算问题,参考一本通 1276:[例9.20]编辑距离 Code: #include <iostream> #include <cstdio> #include <cstring> using namespace std; //Mystery_Sky // #define INF 0x3f3f3f3f #define M 3000 int f[M][M]; int len_a, len_b; char a[M], b[M]; int m

【JavaScript】计算字符串的长度

定义: functionGetChineseCount(str) { varchinieseCount=0; varbadChar="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; badChar+="abcdefghijklmnopqrstuvwxyz"; badChar+="0123456789"; badChar+=""+" ";//半角与全角空格 badChar+="`[emai

C# 计算字符串的哈希值(MD5、SHA)

一.关于本文 本文中是一个类库,包括下面几个函数: 1)计算32位MD5码(大小写):Hash_MD5_32 2)计算16位MD5码(大小写):Hash_MD5_16 3)计算32位2重MD5码(大小写):Hash_2_MD5_32 4)计算16位2重MD5码(大小写):Hash_2_MD5_16 5)计算SHA-1码(大小写):Hash_SHA_1 6)计算SHA-256码(大小写):Hash_SHA_256 7)计算SHA-384码(大小写):Hash_SHA_384 8)计算SHA-512

栈的应用--计算字符串表达式

计算机的本质工作就是做数学运算,那计算机可以读入字符串"1+2+3+4+5+6+7"并计算值吗? 答案是肯定的. 这里我基本实现了个位数的加减乘除,当然这个算法最简单的解决方式是采用二叉树(后面会实现~),这里作出了栈的实现方式. 首先引入两个概念: 中缀表达式和后缀表达式 1,在生活中我们通常书写1+1的时候都会写成1+1,废话~,这就是中缀表达式,更符合人们的思维习惯与想法. 2,所谓后缀表达式就是将运算符写在操作数的后面,这样更符合计算机的思维. 举例: 5 + 3