编辑距离(一)

  算法   5分钟   128浏览   0评论

题目链接:https://www.nowcoder.com/practice/6a1483b5be1547b1acd7940f867be0da

题目描述

给定两个字符串 str1 和 str2 ,请你算出将 str1 转为 str2 的最少操作数。

你可以对字符串进行3种操作:

1.插入一个字符

2.删除一个字符

3.修改一个字符。

字符串长度满足 1≤n≤1000 ,保证字符串中只出现小写英文字母。

示例 1

输入:   "nowcoder","new"
返回值: 6
说明:   "nowcoder"=>"newcoder"(将'o'替换为'e'),修改操作1"nowcoder"=>"new"(删除"coder"),删除操作5

示例 2

输入:   "intention","execution"
返回值: 5
说明:   一种方案为:
        因为2个长度都是9,后面的4个后缀的长度都为"tion",于是从"inten""execu"逐个修改即可

示例 3

输入:   "now","nowcoder"
返回值: 5

解题代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param str1 string字符串
     * @param str2 string字符串
     * @return int整型
     */
    public int editDistance (String str1, String str2) {
        // write code here
        int[][] dp = new int[2][str2.length() + 1]; //定义动规数组,两行分别表示当前和上一轮的结果,分别为i%2和(i+1)%2

        for (int i = 1; i <= str2.length(); i++) { //初始化
            dp[0][i] = i;
        }
        for (int i = 1; i <= str1.length(); i++) {
            for (int j = 1; j <= str2.length(); j++) {
                if (str1.charAt(i - 1) == str2.charAt(j - 1)) { //第一种情况
                    if (j - 1 == 0) {
                        dp[i % 2][j] = i - 1;
                    } else {
                        dp[i % 2][j] = dp[(i + 1) % 2][j - 1];
                    }

                } else { //第二种情况
                    if (j - 1 == 0) {
                        dp[i % 2][j] = Math.min(dp[(i + 1) % 2][j] + 1, i);
                    } else {
                        dp[i % 2][j] = Math.min(dp[(i + 1) % 2][j] + 1,
                                                Math.min(dp[(i + 1) % 2][j - 1] + 1, dp[i % 2][j - 1] + 1));
                    }

                }
            }
        }
        return dp[str1.length() % 2][str2.length()];
    }
}

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  0 条评论