飞鸟各投林

导航

[华为]计算字符串的距离

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。

Ex:

字符串A:abcdefg

字符串B: abcdef

通过增加或是删掉字符”g”的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。

要求:

给定任意两个字符串,写出一个算法计算它们的编辑距离。

请实现如下接口

/* 功能:计算两个字符串的距离

 * 输入:字符串A和字符串B

 * 输出:无

 * 返回:如果成功计算出字符串的距离,否则返回-1

 */

    public static int calStringDistance (String charA, String  charB)

    {

       return 0;

    } 

输入描述:输入两个字符串
输出描述:得到计算结果

输入例子:

abcdefg
abcdef
输出例子:
1
 1 //典型的动态规划优化编辑器问题
 2 //参考博客 http://blog.csdn.net/shizheng163/article/details/50988023
 3 #include<iostream>
 4 #include <string>
 5 #include <vector>
 6 using namespace std;
 7 int calStringDistance(string a,string b)
 8 {    int n = (int)a.size(),m = (int)b.size();    
 9       vector<vector<int>>dp(n+1,vector<int>(m+1,0));    
10      dp[0][0] = 0;//dp[x][y]代表将a字符串前x个字符修改成b字符串前y个字符    
11       for (int i=1; i<=m; ++i) 
12          dp[0][i] = i;    
13       for (int i=1; i<=n; ++i) 
14          dp[i][0] = i;    
15      for (int i=1; i<=n; ++i)
16     {        
17         for (int j=1; j<=m; ++j) 
18         {            
19             int one = dp[i-1][j] +1,two = dp[i][j-1]+1,three = dp[i-1][j-1];            
20             if(a[i-1]!=b[j-1]) three+=1;            
21             dp[i][j] = min(min(one,two),three);        
22         }    
23     }    
24      return dp[n][m];
25 }
26 
27 int main()
28 {    
29     string a,b;    
30     while(cin>>a>>b)       
31         cout<<calStringDistance(a, b)<<endl;    
32     return 0;
33 }

posted on 2017-04-05 15:28  飞鸟各投林  阅读(301)  评论(0编辑  收藏  举报