算法第三章实践
1:实践题目:编辑距离问
2:问题描述:设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)
3:算法描述:定义一个用于存放从A字符串i转变为B字符串j所需要的最小次数的二维数组d[n+1][m+1[(nm代表字符串AB的长度)初始化d[i][0] = i;表示将长为i的字符串变为空串B所需要的次数i;d[0][j]= j,表示将空串A变为长为J的字符串B所需的次数j;然后从d[1][1]开始填表,若a[i] = b[j],则A的第i个字符不用做修改,则d[i][j] = d[i-1[[j-1];若不等于,则需进行操作,可从子串d[i-1[j]的基础上增加一个数,或子串d[i][j-1]的基础上删掉一个数,或子串的d[i-1][j-1]的情况下修改一个,从这三个操作中取一个最小的值+1;即可得到d[i][j];
主要代码:
int getlength(char *a, char *b){
int lengthA = strlen(a);
int lengthB = strlen(b);
for(int i = 0; i <=lengthA; i++){
d[i][0] = i;
}
for(int j = 0; j <=lengthB; j++){
d[0][j] = j;
}
for(int i = 1; i <= lengthA; i++){
for(int j = 1; j <= lengthB; j++){
if(a[i-1] == b[j - 1]){
d[i][j] = d[i - 1][j - 1];
}
else{
d[i][j] = min(d[i - 1][j - 1] + 1,d[i][j - 1] + 1,d[i - 1][j] + 1);
}
}
}
return d[lengthA][lengthB];
}
4:复杂度分析
时间间复杂度:从代码中可看出,届时最大为两重for循环,故时间复杂度为O(lenA*enB);
空间复杂度:该程序使用了一个二维数组来存放数据,且数组维度与字符串长度有关,故空间复杂度O(lenA*lenB);
5:心得体会:本次实践上机课进展较为顺利,比起上一次这次我们多做了一道题,在做前两题的时候,能有大概的思路,但当看到第三题,感觉无从下手,向旁边的同学请教了一下,听了同学的思路,自己和队友再一起琢磨一下,最终done;感觉自己平时做的题还是不够多,导致看到陌生的题就感觉无从下手,被题吓怕,更做不出来,以后还是要多和同学交流,多做题,向身边优秀同学学习。