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

18-伪代码详解

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

4.4.4 伪代码详解

编辑距离求解函数:首先计算两个字符串的长度,然后从i=1开始,比较s1[0]和s2[]中的每一个字符,如果字符相等,diff[i][j]=0,否则diff[i][j]=1。因为这个值不需要记录,仅在公式表达时用数组表示,在程序设计时只用一个变量diff就可以了。

取上面+1(即d[i][j]=d[i−1][j]+1),左侧+1(即d[i][j]=d[i][j−1]+1),左上角数值+diff[i][j] (即d[i][j]=d[i−1][j−1]+ diff[i][j])三者当中的最小值,相等时取后者。

直到i>len1时,算法结束,这时d[len1][len2]就是我们要的编辑距离。

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];
}