Leetcode之Edit Distance 问题

来源:互联网 发布:一键抠图软件电脑 编辑:程序博客网 时间:2024/06/06 00:11

问题描述:

Given two words word1 and word2, find the minimum number of steps required to convertword1 toword2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

问题来源:Edit Distance (详细地址:https://leetcode.com/problems/edit-distance/description/)

思路分析:这道题和前面的Delete Operation for Two Strings (删除相应的字符串找到最长公共序列),Distinct Subsequences (删除相应的字符串得到另外一个指定的字符串),而这道题又是不一样的意思,这道题也是将word1转变为word2,但是我们不仅限于删除操作了,现在可以是插入.删除和替换操作。应该可以说是由Distinct Subsequesces 问题演变而来的,而这道题和那道题的解题思路和解题步骤也是近似的。那我们也按照那个思路来解:

1.)首先也需要申请两个数组,也需要两个指针i和j,分别指向两个字符串。接着考虑初始化操作,在这初始化第一行和第一列,即其中一个为空字符串,考虑最少步数那就直接删除就好了,有多长就删除多少步,即:distance[i][0] = i;和distance[0][j] = j。第一个是word2为空字符串,第二个表示的是word1为空字符串所需要删除的最少步数。所以,初始化操作就到此结束了。

2.)下面我们看看状态转移方程,也分为当前字符相等和不想等两种情况,同时我们控制住j指向的字符串是不变的。先考虑简单点的,如果当前的字符是相等的,那简单,直接不需要多余的步骤,直接就等于之前所需要步数,即distance[i][j] = distance[i - 1][j - 1];那要是不相等呢?我们就考虑通过一定的手段让它们是相等的,这个时候,题目给出的三种操作都可以拿出来分析了:

       a.)插入一个字符:当前的第i个字符和第j个字符已经是不相等的,所以我们插入一个新的字符来满足使得该字符和j指向的字符相等,即i指向的字符和j-1指向的字符匹配,所以我们需要操作的步数满足:distance[i][j] = distance[i][j - 1] + 1;

       b.)删除一个字符:当前的第i个字符和第j个字符已经是不相等的,所以我们删除掉该字符来满足使得删除掉的字符和j指向的字符相等,即:distance[i][j] = distance[i - 1][j] + 1;

       c.)替换掉一个字符:目前的字符是不匹配的,我们通过替换使得它们相等,也就是说distance[i][j] = distance[i - 1][j - 1] + 1。

然而,这道题考虑的是最少的步数,所以我们得取这三种操作中最小值,即:

distance[i][j] = Integer.min(Integer.min(distance[i - 1][j], distance[i][j - 1]),

                                             distance[i - 1][j - 1]) + 1;


代码:

初始化部分:


状态转移部分:






原创粉丝点击