问题描述:
给出两个单词str1和str2,写一个函数计算出将str1 转换为str2的最少操作次数。
你总共三种操作方法:
1、插入一个字符
2、删除一个字符
3、替换一个字符
格式:
输入行输入两个字符串 str1 和 str2,最后输出将 str1 转换为 str2的最少操作次数。
例如:
输入
word1 = "sailn"
word2 = "failing'"
输出
3
代码实现:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>编辑距离及编辑距离算法</title> <script type="text/javascript"> function min(a,b){ return a < b ? a:b; } function edit(str1, str2){ if(str1 == null || str2 == null){ return 0; } var max1 = str1.length; var max2 = str2.length; //arr表示: str1->0-max1-1;str2->0-max2-1,转换需要的最小次数 //定义二维数组的方式,先定义一维的,每个一维数据里面的一个元素是一个数组 var arr= new Array(max1+1); for(var i=0;i<max1+1;i++){ arr[i] = new Array(max2+1); } //边界 for(var i=0;i<max1+1;i++){ arr[i][0]=i; } for(var j=0;j<max2+1;j++){ arr[0][j]=j; } //状态转移计算 for(var i = 1;i<max1+1;i++){ for(var j=1;j<max2+1;j++){ var d; var temp = min(arr[i-1][j]+1,arr[i][j-1]+1); if(str1[i-1] == str2[j-1]){ d = 0; }else{ d=1; } //删一个,插入一个,替换三种情况下的最小转换次数 arr[i][j] = min(temp,arr[i-1][j-1]+d); } } document.write("转换矩阵为:<br/>") for(var i = 0;i<max1+1;i++){ for(var j=0;j<max2+1;j++){ document.write(arr[i][j] + " ") } document.write("<br/>") } document.write("*******************<br/>") document.write('最小转换次数为:'+arr[max1][max2]); } </script> </head> <body> <input type="button" name="btn" value="查看次数" onclick="edit(prompt('请输入第一个单词:','sailn'),prompt('请输入第二个单词:','failing'));"> </body> </html>
效果图: