zoukankan      html  css  js  c++  java
  • [Swift]LeetCode72. 编辑距离 | Edit Distance

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9927706.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.

    You have the following 3 operations permitted on a word:

    1. Insert a character
    2. Delete a character
    3. Replace a character

    Example 1:

    Input: word1 = "horse", word2 = "ros"
    Output: 3
    Explanation: 
    horse -> rorse (replace 'h' with 'r')
    rorse -> rose (remove 'r')
    rose -> ros (remove 'e')
    

    Example 2:

    Input: word1 = "intention", word2 = "execution"
    Output: 5
    Explanation: 
    intention -> inention (remove 't')
    inention -> enention (replace 'i' with 'e')
    enention -> exention (replace 'n' with 'x')
    exention -> exection (replace 'n' with 'c')
    exection -> execution (insert 'u')

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

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

    1. 插入一个字符
    2. 删除一个字符
    3. 替换一个字符

    示例 1:

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

    示例 2:

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

    40ms
     1 class Solution {
     2     func minDistance(_ word1: String, _ word2: String) -> Int {
     3         if word1.count == 0 {
     4             return word2.count
     5         }
     6         if word2.count == 0 {
     7             return word1.count
     8         }
     9 
    10         let c1 = Array(word1)
    11         let c2 = Array(word2)
    12         var cache = [[Int]](repeating: [Int](repeating: -1, count: c2.count), count: c1.count)
    13 
    14         return match(c1, c2, 0, 0, &cache)
    15     }
    16 
    17     fileprivate func match(_ c1: [Character], _ c2: [Character], _ i: Int, _ j: Int, _ cache: inout [[Int]]) -> Int {
    18         if c1.count == i {
    19             return c2.count - j
    20         }
    21         if c2.count == j {
    22             return c1.count - i
    23         }
    24 
    25         if cache[i][j] != -1 {
    26             return cache[i][j]
    27         }
    28 
    29         if c1[i] == c2[j] {
    30             cache[i][j] = match(c1, c2, i + 1, j + 1, &cache)
    31         } else {
    32             let insert = match(c1, c2, i, j + 1, &cache)
    33             let delete = match(c1, c2, i + 1, j, &cache)
    34             let replace = match(c1, c2, i + 1, j + 1, &cache)
    35 
    36             cache[i][j] = min(min(insert, delete), replace) + 1
    37         }
    38 
    39         return cache[i][j]
    40     }
    41 }

    80ms

     1 class Solution {
     2     func minDistance(_ word1: String, _ word2: String) -> Int {
     3         var w1arr = Array(word1.characters)
     4         var w2arr = Array(word2.characters)
     5         var w1len  = w1arr.count
     6         var w2len = w2arr.count
     7         
     8         if(word1.isEmpty && word2.isEmpty) {
     9             return 0
    10         }
    11         if(word1.isEmpty) {
    12             return word2.count
    13         }
    14         else if(word2.isEmpty) {
    15             return word1.count
    16         }
    17         
    18         var dp = Array(repeating:Array(repeating:0,count:w2len+1),count:w1len+1)
    19     
    20         for i in 0...w2len {
    21             dp[0][i] = i
    22         }
    23         for i in 0...w1len {
    24             dp[i][0] = i
    25         }
    26         
    27         for idx1 in 1...w1len {
    28             for idx2 in 1...w2len {
    29                 var minChange = min(min(dp[idx1-1][idx2],dp[idx1-1][idx2-1]),dp[idx1][idx2-1])
    30                 dp[idx1][idx2] = w1arr[idx1-1] == w2arr[idx2-1] ?  dp[idx1-1][idx2-1] : minChange + 1
    31             }
    32         }
    33         
    34         return dp[w1len][w2len]
    35         
    36     }
    37 }

    92ms

     1 class Solution {
     2     func minDistance(_ word1: String, _ word2: String) -> Int {
     3         var res = Array(repeating: Array(repeating: 0, count: word2.count + 1), count: word1.count + 1)
     4         let word1Array = Array(word1)
     5         let word2Array = Array(word2)
     6         for i in 0...word1.count {
     7             for j in 0...word2.count {
     8                 if i == 0 {
     9                     res[i][j] = j
    10                 }else if j == 0 {
    11                     res[i][j] = i
    12                 }else if word1Array[i - 1] == word2Array[j - 1] {
    13                     res[i][j] = res[i - 1][j - 1]
    14                 }else {
    15                     res[i][j] = min(res[i - 1][j - 1], min(res[i - 1][j], res[i][j - 1])) + 1
    16                 }
    17             }
    18         }
    19         return res[word1.count][word2.count]
    20     }
    21 }

    120ms

     1 class Solution {
     2 //向word1插入:dp[i][j] = dp[i][j-1] + 1;
     3 //从word1删除:dp[i][j] = dp[i-1][j] + 1;
     4 //替换word1元素:dp[i][j] = dp[i-1][j-1] + 1;
     5     func minDistance(_ word1: String, _ word2: String) -> Int {
     6         
     7         let m = word1.count
     8         let n = word2.count
     9         
    10         if m == 0 { return n }
    11         if n == 0 { return m }
    12         
    13         let chars1 = Array(word1.characters)
    14         let chars2 = Array(word2.characters)
    15         
    16         var f = [[Int]](repeating:[Int](repeating: 0, count: n + 1), count: m + 1)
    17         
    18         for i in 0...m {
    19             f[i][0] = i
    20         }
    21         
    22         for i in 0...n {
    23             f[0][i] = i
    24         }
    25         
    26         for i in 1...m {
    27             for j in 1...n {
    28                 
    29                 if chars1[i - 1] == chars2[j - 1] {
    30                     f[i][j] = f[i - 1][j - 1]
    31                 } else {
    32                     f[i][j] = min(f[i][j - 1], f[i - 1][j], f[i - 1][j - 1]) + 1  
    33                 }
    34             }
    35         }
    36         
    37         return f[m][n]
    38     }
    39 }

    124ms

     1 class Solution {
     2     func minDistance(_ word1: String, _ word2: String) -> Int {
     3         let word1 = Array(word1.characters)
     4         let word2 = Array(word2.characters)
     5         let len1 = word1.count
     6         let len2 = word2.count
     7         var res = Array(repeating: Array(repeating: 0, count: len2+1), count: len1+1)
     8         // res[i][j] = (word1[i] == word2[j] ? res[i+1][j+1] : min(1+res[i][j+1], 1 + res[i+1][j+1], res[i+1][j]))
     9         var j = len2
    10         while j >= 0 {
    11             var i = len1
    12             while i >= 0 {
    13                 if j == len2 { 
    14                     res[i][j] = (len1 - i) // Delete
    15                 } else {
    16                     if i == len1 {
    17                         res[i][j] = (len2 - j) // Insert
    18                     } else {
    19                         res[i][j] = (word1[i] == word2[j] ? res[i+1][j+1] : min(1+res[i][j+1], 1+res[i+1][j+1], 1+res[i+1][j]))
    20                     }
    21                 }
    22                 i -= 1
    23             }
    24             j -= 1
    25         }
    26         
    27         return res[0][0]
    28     }
    29 }
  • 相关阅读:
    Ganglia Install
    [ZZ]perl一揽子特殊变量
    点滴积累【C#】---C#实现上传word将路径保存到数据库,文件保存到服务器。并且按照名称读取服务器的word
    点滴积累【C#】---C#实现上传照片到物理路径,并且将地址保存到数据库,
    点滴积累【C#】---C#实现上传word以流形式保存到数据库和读取数据库中的word文件。
    点滴积累【C#】---将Excel数据导入到数据库
    点滴积累【C#】---TreeView读取数据库
    DIV内英文或者数字不换行的问题 解决办法
    Rabbitmq中rabbitmqctl的常用命令
    Uploadify参数详解
  • 原文地址:https://www.cnblogs.com/strengthen/p/9927706.html
Copyright © 2011-2022 走看看