JAVA算法:最小编辑字符操作数
给定两个字符串str1和str2及以下可以对str1执行的操作。查找将“str1”转换为“str2”所需的最小编辑(操作)数。
Insert
Remove
Replace
All of the above operations are of equal cost.
例如:
给定字符串:str1 = "geek", str2 = "gesek"
输出结果为: 1
解释:我们将str1变成str2的方法很简单,就是在str1中插入一个字符s即可。
给定字符串:str1 = "cat", str2 = "cut"
输出结果为:1
解释:将str1变成str2的方法就是将 str1中的字符a替换成u即可。
给定字符串:str1 = "sunday", str2 = "saturday"
输出结果为:3
解释:通过对str1和str2的对比,可以发现起始的第1个字符和结束的后3个字符都相同,那么只需要将str1中的un变成atur即可。
那么un怎么变成atur呢?只需要将n替换成r,插入一个t,插入一个a即可。所以编辑数为3.
问题分析
在这种情况下,子问题是什么?
这个想法是从两个字符串的左侧或右侧逐个处理所有字符。
让我们从右角遍历,每对被遍历的字符有两种可能。
m:str1的长度(第一个字符串)
n:str2的长度(第二个字符串)
如果两个字符串的最后一个字符相同,则无需执行任何操作。忽略最后一个字符并获取剩余字符串的计数。因此,我们对长度m-1和n-1进行递归。
否则(如果最后一个字符不相同),我们考虑“str1”上的所有操作,考虑第一个字符串最后一个字符上的所有三个操作,递归计算所有三个操作的最小成本,并取最小值三个。
插入:对m和n-1重复
删除:对m-1和n