编辑距离
来源:互联网 发布:网络销售干什么的 编辑:程序博客网 时间:2024/06/09 06:03
编辑距离
1.编辑距离指两个字符串之间,有一个转成另一个所需要的最小编辑操作次数(增,删,改)
2.分析
运用动态规划
首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。
显然可以有如下动态规划公式:
- if i == 0 且 j == 0,edit(i, j) = 0
- if i == 0 且 j > 0,edit(i, j) = j
- if i > 0 且j == 0,edit(i, j) = i
- if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。
3.代码 c++版本
#include <iostream>#include <string>using namespace std;int min(int a, int b){ return a < b ? a : b;}int edit(string str1, string str2){ int max1 = str1.size(); int max2 = str2.size(); int **ptr = new int*[max1 + 1]; for(int i = 0; i < max1 + 1 ;i++) { ptr[i] = new int[max2 + 1]; } for(int i = 0 ;i < max1 + 1 ;i++) { ptr[i][0] = i; } for(int i = 0 ;i < max2 + 1;i++) { ptr[0][i] = i; } for(int i = 1 ;i < max1 + 1 ;i++) { for(int j = 1 ;j< max2 + 1; j++) { int d; int temp = min(ptr[i-1][j] + 1, ptr[i][j-1] + 1); if(str1[i-1] == str2[j-1]) { d = 0 ; } else { d = 1 ; } ptr[i][j] = min(temp, ptr[i-1][j-1] + d); } } cout << "**************************" << endl; for(int i = 0 ;i < max1 + 1 ;i++) { for(int j = 0; j< max2 + 1; j++) { cout << ptr[i][j] << " " ; } cout << endl; } cout << "**************************" << endl; int dis = ptr[max1][max2]; for(int i = 0; i < max1 + 1; i++) { delete[] ptr[i]; ptr[i] = NULL; } delete[] ptr; ptr = NULL; return dis;}int main(void){ string str1 = "sailn"; string str2 = "failing"; int r = edit(str1, str2); cout << "the dis is : " << r << endl; return 0;}
python版本
#!/usr/bin/pythonclass MinEditLen(): def __init__(self): pass def get_min_len(self,first,second): if len(first) == 0: return len(second) if len(second) == 0: return first if len(first) > len(second): first,second = second,first first_len = len(first) second_len = len(second) distance_matrix = [range(second_len) for x in range(first_len)] for i in range(1,first_len): for j in range(1, second_len): deletion = distance_matrix[i-1][j] +1 insertion = distance_matrix[i][j-1] +1 modify = distance_matrix[i-1][j-1] if first[i] != second[j] : modify += 1 distance_matrix[i][j]= min(deletion,insertion, modify) return distance_matrix[first_len-1][second_len-1]if __name__=="__main__": ob = MinEditLen() print ob.get_min_len("abcdefg", "aabbccddeeff")
0 0
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- EF框架,字段可以为空
- POJ -1258 Agri-Net
- 采用commons-configuration包实现属性文件读取的工具类(hive下windows与linux下通用)
- 工厂模式
- [leetcode] 61.Rotate List
- 编辑距离
- protobuf,json,xml,binary,Thrift之间的对比
- js中的继承的用法
- RTSP流媒体地址
- 蚂蚁微贷
- HDU 1074 Doing Homework(DP·状态压缩)
- listview加载性能优化ViewHolder
- IntelliJ IDEA 14.x 与 Tomcat 集成,创建并运行Java Web项目
- HDU 1005 Number Sequence(数论)