华为机试--字符串距离--c语言
计算字符串的距离
http://www.nowcoder.com/questionTerminal/3959837097c7413a961a135d7104c314
1、距离用dp来计算,为dp[len1]dp[len2]
2、初始化str1距离,坐标为0 开始,dp[i][0],表示字符串str1[i-1]到全删完的距离
3、初始化str2距离,坐标为0 开始,dp[0][i],表示字符串str2[i-1]到全删完的距离
4、循环判断,当两个字符相等,则到这一步的距离为上一步的距离,即dp[i][j] = dp[i-1][j-1]
5、循环判断,当两个字符不相等,则到这一步的距离为上一步的距离dp[i-1][j-1]加一,或者dp[i-1][j]+1,或者dp[i][j-1]+1,取最小值
6、对dp[i-1][j],dp[i][j-1]这两个不太理解,后面慢慢分析
#include<stdio.h>
#include<string.h>
int min(int a,int b){
return a>b?b:a;
}
int main(void){
char str1[1000],str2[1000];
int dp[1000][1000];
while (scanf("%s %s",str1,str2)!=EOF) {
memset(dp, 0, sizeof(dp));
int len1 = strlen(str1),len2=strlen(str2),m=0;
//初始数据,将str1删除为空时,每位需要执行的步骤
for (int i = 0; i<=len1; i++) {
dp[i][0] = i;
}
//初始数据,将str2删除为空时,每位需要执行的步骤
for(int i = 0;i<=len2;i++){
dp[0][i] = i;
}
//循环判断
for(int i=1;i<=len1;i++){
for (int j = 1; j<=len2; j++) {
if(str1[i-1] == str2[j-1]){
m = dp[i-1][j-1];
dp[i][j] = m;
}
else{
m = min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1);
dp[i][j] = m;
}
}
}
printf("%d\n",dp[len1][len2]);
}
return 0;
}
CVTE公司福利 716人发布
