leetcode 72. 编辑距离

题目链接
计算字符串1变换为字符串2需要的最少步数
输入: word1 = "horse", word2 = "ros"
输出: 3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

首先我们要确定这是个动态规划的题目
dp数组:
表示当字符串 word1 的长度为 i,字符串 word2 的长度为 j 时,将 word1 转化为 word2 所使用的最少操作次数为 dp[i] [j]。
初始化:
如果有一个字符串的长度为0,所以另外一个字符串长度每长1就要+1

然后会过来解析题目
如果 word1[i] 与 word2 [j] 相等,这个时候不需要进行任何操作,有 dp[i] [j] = dp[i-1] [j-1]。
如果word1[i] 与 word2 [j] 不相等
1.替换成相等的

`dp[i] [j] = dp[i-1] [j-1] + 1;`

2.在word1[i]后插入一个然后让world[i]与world[j]相等

`dp[i] [j] = dp[i] [j-1] + 1;`

3.删除word1[i]

`dp[i] [j] = dp[i-1] [j] + 1;`

因为这里要求最小的,所以我们要选择最小步数的一个
则有

dp[i][j] =min(dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j]) + 1;

又因为在c++中min函数是两个之间的比较,所以我们要写成这种方式

dp[i][j] = min(min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
int minDistance(string word1, string word2) {
    int size1 = word1.size();
    int size2 = word2.size();
    int dp[1010][1010] = { 0 };
    for (int i = 1; i <= size2; i++) {
        dp[0][i] = dp[0][i - 1] + 1;
    }
    for (int i = 1; i <= size1; i++) {
        dp[i][0] = dp[i - 1][0] + 1;
    }
    for (int i = 1; i <=size1; i++) {
        for (int j = 1; j <= size2; j++) {
            if (word1[i - 1] == word2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1];
            }
            else {
                dp[i][j] = min(min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
            }
        }
    }
    return dp[size1][size2];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值