当前位置:嗨网首页>书籍在线阅读

19-实战演练

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.4.5 实战演练

//program 4-2
#include <iostream>
#include <cstring>
using namespace std;
const int N=100;
char str1[N],str2[N];
int d[N][N]; //d[i][j]表示str1前i个字符和str2前j个字符的编辑距离。
int min(int a, int b)
{
     return a<b?a:b;//返回较小的值
}
int editdistance (char *str1, char *str2)
{
     int len1 = strlen(str1); //计算字符串长度
     int len2 = strlen(str2);
     for(int i=0;i<=len1;i++)//当第二个串长度为0,编辑距离初始化为i
          d[i][0]= i;
     for(int j=0;j<=len2;j++)//当第一个串长度为0,编辑距离初始化为j
          d[0][j]=j;
     for(int i=1;i <=len1;i++)//遍历两个字符串
     {
          for(int j=1;j<=len2;j++)
          {
               int diff;//判断str[i]是否等于str2[j],相等为0,不相等为1  
               if(str1[i-1] == str2[j-1])//相等
                     diff = 0 ;
               else
                     diff = 1 ;
               int temp = min(d[i-1][j] + 1, d[i][j-1] + 1);//先两者取最小值
               d[i][j] = min(temp, d[i-1][j-1] + diff);//再取最小值,
                     //相当于三者取最小值d[i-1][j] + 1, d[i][j-1] + 1,d[i-1][j-1] + diff
          }
     }
     return d[len1][len2];
}
int main()
{
     cout << "输入字符串str1:"<<endl;
     cin >> str1;
     cout << "输入字符串str2:"<<endl;
     cin >> str2;
     cout << str1<< "和"<<str2<<"的编辑距离是:"<<editdistance (str1,str2);
     return 0;
}

算法实现和测试

(1)运行环境

Code::Blocks

(2)输入

输入字符串str1:
family
输入字符串str2:
frame

(3)输出

family和frame的编辑距离是:4