求解字符串间最短距离(字符串相似度)
来源:互联网 发布:淘宝内部优惠券推广员 编辑:程序博客网 时间:2024/06/05 12:58
问题描述:
给定任意两个字符串,比如:str1=“abcd”和str2=“gbcdz”,计算这两个字符串间的相似度。计算两字符串的相似度可等价于计算将str1变换到str2所需要的最少步骤。
问题分析:
为计算将str1变换到str2所需最小操作步骤,必须先对变换操作进行定义:
- 修改一个字符(如把“a”替换为“g”);
- 增加一个字符(如把“abcd”变为“abcdz”);
- 删除一个字符(如把“travelling”变为“traveling”);
字符串变换过程中执行了上述三个操作之间的任一操作,则两字符串间距离就加1。例如将上文中的str1变换到str2,即“abcd”到“gbcdz”,通过“abcd”->(操作1)->“gbcd”->(操作2)->“gbcdz”,需进行一次修改和一次添加字符操作,故两字符串距离为2,那么字符串相似度则为距离+1的倒数,即1/3=0.333。这是由俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。因此也叫Levenshtein Distance。
那么如果给定两个任意字符串,如何计算它们距离呢?
问题解决:
解决此问题最好的方法是采用动态规划的方法。如下:
设str1=“abcd”,str2=“gbcdz”,定义一个二维数组d[][],d[i][j]表示str1中取前i个字符和str2中取前j个字符的最短距离,例如d[3][2]表示“abc”到“gb”的最短距离。
d[i][j]的计算规则有三条:
- 来自d[i - i][j - 1],即 “str1的前i-1个字符组成的子串” 到 “str2的前j-1个字符组成的子串” 的最小距离,此时如果str1[i] = str2[j],则最短距离不变,否则最短距离加1(即把str1[i]变为str2[j] ),所以d[i][j] = d[i - 1][j - 1] + (str1[i] == str2[j] ? 0 : 1)
- 来自d[i - 1][j],即 “A的前i-1个字符组成的子串” 到 “B的前j个字符组成的子串” 的编辑距离。此时删除在A的第i个位置上的字符即可,所以d[i][j] = d[i - 1][j] + 1
- 来自d[i][j - 1], 即 “A的前i个字符组成的子串” 到 “B的前j-1个字符组成的子串” 的编辑距离。此时在A的子串后面添加一个字符B[j]即可,所以d[i][j] = d[i][j - 1] + 1
于是状态转移方程:d[i][j] = min (d[i - 1][j - 1] + (str1[i] == str2[j] ? 0 : 1) , d[i - 1][j] + 1 , d[i][j - 1] + 1)
例如str1=“abcd”,str2=“gbcdz”的d[][]就为(注意i,j的取值范围):
代码实现(anycodex.com在线编译器测试通过,试一试?):
#include <stdio.h>#include <stdlib.h>#include <string.h>int min(int a, int b, int c);int calc(char* a, char* b);int main(void){printf("%d",calc("abcd", "gbcdz"));return EXIT_SUCCESS;}int min(int a, int b, int c){ if(a > b) a = b; if(a > c) a = c; return a;}int calc(char* a, char* b){ int lenA = strlen(a); int lenB = strlen(b); int d[lenA+1][lenB+1]; for(int i=0;i<=lenA;++i) d[i][0] = i; for(int i=0;i<=lenB;++i) d[0][i] = i; for(int i=1;i<=lenA;++i) for(int j=1;j<=lenB;++j) d[i][j] = min(d[i-1][j-1] + (a[i-1] == b[j-1] ? 0:1), d[i-1][j]+1, d[i][j-1]+1); return d[lenA][lenB];}
0 0
- 求解字符串间最短距离(字符串相似度)
- 求解字符串间最短距离(字符串相似度)
- 字符串最短距离问题
- 算法之美——求解 字符串间最短距离(动态规划)
- 算法之美——求解 字符串间最短距离(动态规划)
- 字符串间最短距离(动态规划)
- 字符串间最短距离(动态规划)
- 相似字符串(字符串编辑)最短距离(非递归版本)
- 字符串之间的最短距离
- 字符串相似度算法 递归与动态规划求解分析
- 字符串相似度/相似字符串变换
- 计算字符串相似度
- 字符串的相似度
- 字符串的相似度
- 字符串相似度
- 字符串的相似度
- 字符串相似度算法
- 字符串相似度算法
- js各种框架和主要用途方向.
- java中的url 编码与解码
- 关于类的结构图
- 5亿个数找中位数
- python学习之--Django--Get and Post
- 求解字符串间最短距离(字符串相似度)
- hihoCoder hiho一下 第四十二周:骨牌覆盖问题·二
- 使用Session防止表单重复提交
- 反渗透设备:反渗透设备在运行准备
- 解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效
- iOS支付宝支付步骤
- win7绑定host
- sql System.Data.SqlClient.SqlError: 无法覆盖文件 'C:\Program Files\Microsoft SQL Server\MSSQL\data\itsm_Da
- [150420][C++]数据结构复习——链表实现源码