字符串的编辑距离
来源:互联网 发布:淘宝怎么删除追加评论 编辑:程序博客网 时间:2024/05/01 13:23
编辑距离
编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。度娘
动态规划解法
记
对于
(欲哭无泪。。。。\left 必须成对出现。。。真是大BUG)
算法步骤:
(哎。。。CSDN 的Markdown 真是无力吐槽。。。)
来来来 上代码 申请的空间记得释放
#include <iostream>using namespace std;int editableDistance(string strFrom,string strDest);void initialArray2D(int** arrayTemp,int m,int n);void free2DArray(int** arrayTemp,int m,int n);void displayArray2D(int** arrayTemp,int m,int n);int minNumber(int num1,int num2,int num3);int main(){ string strOne="I LOVE READING"; string strTwo="I LOVE EATING"; cout<<"Please Enter Two Strings:\n"; //cin>>strOne>>strTwo; int result = editableDistance(strOne,strTwo); cout<<"\nThe distance between "<<strOne<<" and "<<strTwo<<"is "<<result<<endl; return 0;}int editableDistance(string strFrom,string strDest){ int lenFrom = strFrom.length(); int lenDest = strDest.length(); int distace = 0; //声明并初始化二维数组 int** arrayDis = new int*[lenFrom+1];//2D array for(int i=0;i<=lenFrom;++i){ arrayDis[i]= new int[lenDest+1]; } initialArray2D(arrayDis,lenFrom,lenDest); //初始化距离数组 for(int j=1;j<=lenDest;++j){ //dis[0,j]<-j arrayDis[0][j]=j; } for(int i=1; i<=lenFrom; ++i) { arrayDis[i][0]=i;//dis[i,0]<-i for(int j=1; j<=lenDest; ++j) { if(strFrom[i-1]==strDest[j-1]){ arrayDis[i][j]=arrayDis[i-1][j-1]; }else{ arrayDis[i][j]=minNumber(arrayDis[i-1][j],arrayDis[i-1][j-1],arrayDis[i][j-1])+1; } } } //输出距离矩阵 displayArray2D(arrayDis,lenFrom,lenDest); distace = arrayDis[lenFrom-1][lenDest-1]; free2DArray(arrayDis,lenFrom,lenDest); return distace;}//初始化二维数组void initialArray2D(int** arrayTemp,int m,int n){ for(int i=0;i<=m;++i){ for(int j=0;j<=n;++j){ arrayTemp[i][j]=0; //cout<<arrayTemp[i][j]; } }}//动态数组的删除操作void free2DArray(int** arrayTemp,int m,int n){ for(int i=m;i>=0;--i){ delete[] arrayTemp[i]; arrayTemp[i] = NULL; } arrayTemp=NULL;}//输出二维数组void displayArray2D(int** arrayTemp,int m,int n){ for(int i=0;i<=m;++i){ cout<<endl; for(int j=0;j<=n;++j){ cout<<arrayTemp[i][j]<<"\t"; } }}//求三个数的最大值int minNumber(int num1,int num2,int num3){ return min(min(num1,num2),num3);}
此外,对于每次进行第
废话不说上代码。。。
#include <iostream>using namespace std;int editableDistance(string strFrom,string strDest);int minNumber(int num1,int num2,int num3);int main(){ string strOne="TJU"; string strTwo="NKU"; cout<<"Please Enter Two Strings:\n"; //cin>>strOne>>strTwo; int result = editableDistance(strOne,strTwo); cout<<"\nThe distance between "<<strOne<<" and "<<strTwo<<"is "<<result<<endl; return 0;}int editableDistance(string strFrom,string strDest){ int lenFrom = strFrom.length(); int lenDest = strDest.length(); int arrayLen = max(lenFrom,lenDest); int distance = 0;//记录距离 //声明并初始化二维数组 int* arrayOld = new int[arrayLen+1]; int* arrayNew = new int[arrayLen+1]; int* tempPointer = NULL; //初始化距离数组 for(int j=0;j<=lenDest;++j){ //d[0,j]<-j arrayOld[j]=j; } for(int i=1; i<=lenFrom; ++i) { arrayNew[0]=i;//d[i,0]<-i for(int j=1; j<=lenDest; ++j) { if(strFrom[i-1]==strDest[j-1]){ arrayNew[j]=arrayOld[j-1]; }else{ arrayNew[j]=minNumber(arrayNew[j-1],arrayOld[j-1],arrayOld[j])+1; } } //交换 tempPointer=arrayOld; arrayOld = arrayNew; arrayNew = tempPointer; } distance = arrayOld[arrayLen]; delete[] arrayNew;arrayNew=NULL; delete[] arrayOld;arrayOld=NULL; tempPointer = NULL; return distance;//因为与arrayNew交换了,所以old是最新的结果}//求三个数的最大值int minNumber(int num1,int num2,int num3){ return min(min(num1,num2),num3);}
哎。。。友情赠送算法伪代码的
\documentclass[11pt]{article}\usepackage{CJK}\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry}\usepackage{algorithm}\usepackage{algorithmicx}\usepackage{algpseudocode}\usepackage{amsmath}\begin{CJK*}{UTF8}{gkai} \begin{algorithm} \caption{编辑距离的动态规划算法} \begin{algorithmic}[1] %每行显示行号 \For{$j \in \{1,2,...,n_2\}$} \do\\ \State $dis[0,j] \gets j$ \EndFor \For{$i \in \{1,2,...,n_1\}$} \do\\ \State $dis[i,0] \gets i$ \For{$j \in \{1,2,...,n_2\}$} \do\\ \If{$S_1(i) == S_2(j) then$ } \State $dis[i,j] \gets dis[i-1,j-1]$ \Else \State $dis[i,j] \gets min \{dis[i,j-1],dis[i-1,j],dis[i-1,j-1]\}+1$ \EndIf \EndFor \EndFor \end{algorithmic} \end{algorithm}\end{CJK*}\end{document}
阅读书目
- 刁瑞, 谢妍. 算法笔记[M]. 电子工业出版社, 2016.
0 0
- 字符串的编辑距离
- 字符串的编辑距离
- 字符串的编辑距离
- 字符串的编辑距离
- 字符串的编辑距离
- 字符串的编辑距离
- zjut1381 字符串的编辑距离
- 字符串之间的编辑距离
- 字符串编辑距离的计算方法
- 基于字符串的编辑距离
- 字符串的编辑距离和编辑距离算法
- 计算字符串的相似度---编辑距离
- DP求两个字符串的编辑距离
- 动态规划 - 字符串的编辑距离
- 基于编辑距离的字符串近似搜索
- DP求两个字符串的编辑距离
- 两字符串的编辑距离 (Eidt Distance)
- 求两个字符串的编辑距离
- 内核态空间地址直接映射到用户态空间访问
- (转)NGUI控件说明(中文) UISlider
- (基础十四)LuckNumber(幸运数字)
- COM组件(MFC篇)
- 第十四周 项目1--验证算法--(4)平衡二叉树
- 字符串的编辑距离
- Android圆角图片
- unity中的遮挡剔除使用(一)
- 数据结构实验之图论六:村村通公路
- jquery中的ajax应用
- 图的m着色问题-回溯法
- HDU 2014 青年歌手大奖赛_评委会打分
- linux用户切换
- 二叉树的层次遍历