LeetCode:72. Edit Distance(编辑的最小步数)

「爱情、让人受尽委屈。」 2022-04-05 13:20 285阅读 0赞

文章最前: 我是Octopus,这个名字来源于我的中文名—章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. LeetCode:55. Jump Game(跳远比赛)
  2. Leetcode:300. Longest Increasing Subsequence(最大增长序列)
  3. LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)

文件目录:

题目描述:

java实现方法1:(利用动态规划)

python实现方式1:

源码github地址:https://github.com/zhangyu345293721/leetcode


题目描述:

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

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

插入一个字符
删除一个字符
替换一个字符
示例 1:

  1. 输入: word1 = "horse", word2 = "ros"
  2. 输出: 3
  3. 解释:
  4. horse -> rorse (将 'h' 替换为 'r')
  5. rorse -> rose (删除 'r')
  6. rose -> ros (删除 'e')

示例 2:

  1. 输入: word1 = "intention", word2 = "execution"
  2. 输出: 5
  3. 解释:
  4. intention -> inention (删除 't')
  5. inention -> enention (将 'i' 替换为 'e')
  6. enention -> exention (将 'n' 替换为 'x')
  7. exention -> exection (将 'n' 替换为 'c')
  8. exection -> execution (插入 'u')

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/edit-distance


java实现方法1:

  1. /**
  2. * 编辑距离最小步数
  3. *
  4. * @param word1 字符串1
  5. * @param word2 字符串2
  6. * @return 步数
  7. */
  8. public int minDistance(String word1, String word2) {
  9. int n = word1.length();
  10. int m = word2.length();
  11. if (n * m == 0){
  12. return n + m;
  13. }
  14. int[][] d = new int[n + 1][m + 1];
  15. for (int i = 0; i < n + 1; i++) {
  16. d[i][0] = i;
  17. }
  18. for (int j = 0; j < m + 1; j++) {
  19. d[0][j] = j;
  20. }
  21. for (int i = 1; i < n + 1; i++) {
  22. for (int j = 1; j < m + 1; j++) {
  23. int left = d[i - 1][j] + 1;
  24. int down = d[i][j - 1] + 1;
  25. int leftDown = d[i - 1][j - 1];
  26. if (word1.charAt(i - 1) != word2.charAt(j - 1)){
  27. leftDown += 1;
  28. }
  29. d[i][j] = Math.min(left, Math.min(down, leftDown ));
  30. }
  31. }
  32. return d[n][m];
  33. }

时间复杂度:O(m.n)

空间复杂度:O(n)


python实现方式1:

  1. import numpy as np
  2. def min_distance(word1: str, word2: str) -> int:
  3. '''
  4. 得到最小步数
  5. Args:
  6. word1: 字符串1
  7. word2:字符串2
  8. Returns:
  9. 最小步数
  10. '''
  11. m = len(word1)
  12. n = len(word2)
  13. if m * n == 0:
  14. return n + m
  15. d = np.zeros((m + 1, n + 1), dtype=np.int)
  16. for i in range(m + 1):
  17. d[i][0] = i
  18. for j in range(n + 1):
  19. d[0][j] = j
  20. for i in range(1, m + 1):
  21. for j in range(1, n + 1):
  22. left = d[i - 1][j] + 1
  23. down = d[i][j - 1] + 1
  24. left_down = d[i - 1][j - 1]
  25. if word1[i - 1] != word2[j - 1]:
  26. left_down += 1
  27. d[i][j] = min(left, min(down, left_down))
  28. return d[n][m]

时间复杂度:O(m.n)

空间复杂度:O(n)


源码github地址:

https://github.com/zhangyu345293721/leetcode

发表评论

表情:
评论列表 (有 0 条评论,285人围观)

还没有评论,来说两句吧...

相关阅读