编辑距离

                                                                             编辑距离

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 
#include 

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/python

class 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")


你可能感兴趣的:(算法)