[经典算法] 字符串相似度-编辑距离

题目说明:

一种衡量两个字符串之间的差异性的方法是,计算两个字符串转换时候需要的最少操作,需要的操作越少说明这两个字符串越相似。

题目解析:

假设字符串的操作只有三种:

  1. 插入一个字符;

  2. 删除一个字符;
  3. 替换一个字符;

两个字符串之间的编辑距离定义为:从字符串str1到str2的最少的操作次数。首先,编辑距离是不会大于str1.length + str2.length的。假设求字符A、B的编辑距离,考虑下面几种情况:

  • 如果A[i] = B[j],那么这时候还需要操作吗?

这个时候的删除和替换操作只会让情况变得更坏,而且插入操作不会使情况变得更好,所以此时F(i, j) = F(i-1, j-1)。

  • 如果A[i] != B[j],怎么办呢?

a、从F(i-1, j-1)变过来,这时候只需要把A[i]替换为B[j]即可;

b、从F(i-1, j)变过来,这时候只需要将A[i]删除即可;

c、从F(i, j-1)变过来,这时候只需要在A[i]后插入字符B[j]即可;

那么此时,F(i, j) = min{F(i-1,j-1),F(i-1,j),F(i,j-1)} + 1。

注:其中F(i, j)表示A[0..i]和B[0..j]之间的编辑距离。

程序代码:

#include <gtest/gtest.h>
#include <iostream>
#include <string>
using namespace std;

int CalcDistance(const string& A, int offsetA,const string& B, int offsetB)
{
    if (A.size() == offsetA)
    {
        return B.size() - offsetB;
    }

    if (B.size() == offsetB)
    {
        return A.size() - offsetA;
    }

    if (A[offsetA] == B[offsetB])
    {
        return CalcDistance(A, offsetA+1, B, offsetB + 1);
    }
    else
    {
        int dist1 = CalcDistance(A, offsetA, B, offsetB + 1);
        int dist2 = CalcDistance(A, offsetA + 1, B, offsetB);
        int dist3 = CalcDistance(A, offsetA + 1, B, offsetB + 1);
        int result = dist1 < dist2 ? dist1 : dist2;
        result = result < dist3 ? result : dist3;

        return result + 1;
    }
}

int main_modify()
{
    return 0;
}

TEST(BaiLian, tLevenshtein)
{
    ASSERT_EQ(CalcDistance("zero",0,"ero",0), 1);
    ASSERT_EQ(CalcDistance("zero",0,"fero",0), 1);
    ASSERT_EQ(CalcDistance("abcddefg",0,"abcefg",0), 2);
    ASSERT_EQ(CalcDistance("abcddefg",0,"abcddefg",0), 0);
    ASSERT_EQ(CalcDistance("abcddfg",0,"abcddefg",0), 1);
    ASSERT_EQ(CalcDistance("",0,"",0), 0);
    ASSERT_EQ(CalcDistance("abcdefgh",0,"",0), 8);
    ASSERT_EQ(CalcDistance("",0,"abcdefgh",0), 8);
}

参考引用

http://www.cnblogs.com/tianchi/archive/2013/02/25/2886964.html

时间: 2024-11-07 04:34:45

[经典算法] 字符串相似度-编辑距离的相关文章

经典算法——字符串的全部组合

#include<iostream> #include<vector> #include<string.h> using namespace std; //从头扫描字符串得到第一个字符,针对第一个字符,有两种选择 //把这个字符放到组合中去,接下来我们须要在剩下的n-1个字符中选取m-1个字符: //假设不把这个字符放到组合中去.则须要在剩下的n-1个字符中选取m个字符 void Combination(char* string, int number, vector&

经典算法——字符串的所有组合

#include<iostream> #include<vector> #include<string.h> using namespace std; //从头扫描字符串得到第一个字符,针对第一个字符,有两种选择 //把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符: //如果不把这个字符放到组合中去,则需要在剩下的n-1个字符中选取m个字符 void Combination(char* string, int number, vector&

经典算法题每日演练——第五题 字符串相似度

原文:经典算法题每日演练--第五题 字符串相似度 这篇我们看看最长公共子序列的另一个版本,求字符串相似度(编辑距离),我也说过了,这是一个非常实用的算法,在DNA对比,网 页聚类等方面都有用武之地. 一:概念 对于两个字符串A和B,通过基本的增删改将字符串A改成B,或者将B改成A,在改变的过程中我们使用的最少步骤称之为“编辑距离”. 比如如下的字符串:我们通过种种操作,痉挛之后编辑距离为3,不知道你看出来了没有? 二:解析 可能大家觉得有点复杂,不好理解,我们试着把这个大问题拆分掉,将"字符串

字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)

在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 俄罗斯科学家V

java文本相似度计算(Levenshtein Distance算法(中文翻译:编辑距离算法))----代码和详解

算法代码实现: package com.util; public class SimFeatureUtil { private static int min(int one, int two, int three) { int min = one; if (two < min) { min = two; } if (three < min) { min = three; } return min; } public static int ld(String str1, String str2)

字符串相似度三种算法介绍

余弦相似度 计算公式为: P(A,B) = sqrt(A × B) / (|A| × |B|) 设有两个字符串: ABCDEFG ABCHIJK 其中共有11个字符,为: A B C D E F G H I J K 如果,不考虑他们之间的关联性以及顺序等隐私,那么可以讲这两个字符串转换成两个11维空间中的向量: {1.1.1.1.1.1.1.0.0.0.0} {1.1.1.0.0.0.0.1.1.1.1} 那,计算他们之间的相似度为: P = sqrt(3) / (sqrt(7) × sqrt(

字符串相似度计算----编辑距离

题目描述: 要求两字符串有差异的字符个数.例如: aaaaabaaaaa aaaaacaabaa 这两个字符串,最大公共字串长度是5,但它们只有两个字符不同,函数输出值应为2. 如果是: aaabbbcccddd aaaeeeddd 函数的输出值应该是6. 比较形象地形容一下,把两个字符串排成上下两行,每个字符串都可以在任何位置插入空格以便上下对齐,每个列上至少有一个字符来自这两个字符串.当对齐程度最高的时候,没有对上的列的数即为函数输出值. aaabbbcccddd aaaeeeddd 最优对

[算法]字符串编辑距离

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

百度面试题 字符串相似度 算法 similar_text 和页面相似度算法

在百度的面试,简直就是花样求虐. 首先在面试官看简历的期间,除了一个自己定义字符串相似度,并且写出求相似度的算法. ...这个确实没听说过,php的similar_text函数也是闻所未闻的.之前看seo的时候,到简单了解了一下页面的相似度,百度算法中很常见的需要判断页面是否是重复的,重复的肯定就不收录了,做seo很重的一个工作就是写原创文章,以保持网站的更新,吸引百度的收录,以增加流量. 页面的相似度,是纯数学的,因为百度的主要是收录中文,所以中文需要先拆词,然后计算词语的在文章中出现的频度.