NOTE

编辑距离

编辑距离 的 LeetCode 解题笔记。

Data Structures & Algorithms创建于 更新于 约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 题目描述

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符 删除一个字符 替换一个字符

2. 思路

  • 递归
  • 递归+缓存

3. 实现

3.1. 递归

package main

func minDistance(word1 string, word2 string) int {
	if len(word1) == 0 || len(word2) == 0 {
		return len(word1) + len(word2)
	}

	//相等那么不需要做任何操作
	if word1[0] == word2[0] {
		return minDistance(word1[1:], word2[1:])
	} else {
		//不相等可以删除
		deleted := 1 + minDistance(word1[1:], word2)
		//不相等可以更新
		updated := 1 + minDistance(word1[1:], word2[1:])
		//不相等可以插入
		inserted := 1 + minDistance(word1, word2[1:])
		return Min(inserted, deleted, updated)
	}
}

func Min(nums ...int) int {
	min := nums[0]
	for _, num := range nums {
		if num < min {
			min = num
		}
	}

	return min
}

3.2. 递归+缓存

package main

import "fmt"

var cache = make(map[string]int, 0)

func minDistance(word1 string, word2 string) int {
	if len(word1) == 0 || len(word2) == 0 {
		return len(word1) + len(word2)
	}

	count, ok := cache[fmt.Sprintf("%s_%s", word1, word2)]
	if ok {
		return count
	}
	var res int
	//相等那么不需要做任何操作
	if word1[0] == word2[0] {
		res = minDistance(word1[1:], word2[1:])

	} else {
		//不相等可以删除
		deleted := 1 + minDistance(word1[1:], word2)
		//不相等可以更新
		updated := 1 + minDistance(word1[1:], word2[1:])
		//不相等可以插入
		inserted := 1 + minDistance(word1, word2[1:])
		res = Min(inserted, deleted, updated)
	}

	cache[fmt.Sprintf("%s_%s", word1, word2)] = res
	return res

}

func Min(nums ...int) int {
	min := nums[0]
	for _, num := range nums {
		if num < min {
			min = num
		}
	}

	return min
}

4. 参考

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看