华为机试--字符串距离--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;
}
全部评论

相关推荐

MinatoWu:是这样的,说的太对了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务