问题描述:
给出两个单词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="查看次数" οnclick="edit(prompt('请输入第一个单词:','sailn'),prompt('请输入第二个单词:','failing'));">
</body>
</html>
效果图: