代码随想录补打卡 583两个字符串的删除操作 72 编辑距离

583两个字符串的删除操作 

代码如下

func minDistance(word1 string, word2 string) int {   dp[i][j]的含义是下标为i-1和下标为j-1的两个数组的最小操作数

                  dp := make([][]int,len(word1)+1)

                  for i,_ := range dp {

                      dp[i] = make([]int,len(word2)+1)

                  }

                  for i := 0 ; i <= len(word1) ; i++ {         dp[i][0]的意思为如果一个数组长度为i,另一个为空,那么需要的操作数是i

                      dp[i][0] = i 

                  }

                  for j := 0 ; j <= len(word2) ; j++ {  同理

                      dp[0][j] = j 

                  }

                  for i := 1 ; i <= len(word1) ; i++ {

                      for j := 1 ; j <= len(word2) ; j++ {

                          if word1[i-1] == word2[j-1] {  如果这两个数相同,则不需要任何操作让他们相同

                              dp[i][j] = dp[i-1][j-1]

                          }else {  如果这两个数不同,则可能需要三种操作,一是删除数组1的元素,二是删除数组2的元素,3是删除数组1和2的元素 。因为这个数都是从前面推出来的,所以遍历到i-1和j-1时说明这两个数组经过dp[i-1][j-1]个操作数已经相同,那么就删除这两个元素即可,所以操作数加2 同理,可能两个数组经过dp[i][j-1]个操作数相同,那么就需要删除j-1这个数,所以操作数加1 

                              dp[i][j] = min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+2))

                          }

                      }

                  }

                  return dp[len(word1)][len(word2)]

}

func min(a,b int) int {

    if a < b {

        return a

    }else {

        return b 

    }

}

72 编辑距离 

代码如下 

func minDistance(word1 string, word2 string) int {

                 dp := make([][]int,len(word1)+1)

                 for i,_ := range dp {

                     dp[i] = make([]int,len(word2)+1)

                 }

                 for i := 0 ; i <= len(word1) ; i++ {

                     dp[i][0] = i 

                 }

                 for j := 0 ; j <= len(word2) ; j++ {

                     dp[0][j] = j

                 }

                 for i := 1 ; i <= len(word1) ; i++ {

                     for j := 1 ; j <= len(word2) ; j++ {

                         if word1[i-1] == word2[j-1] {

                             dp[i][j] = dp[i-1][j-1]

                         }else {    和上面一题基本差不多,就是当两个数不相同时,可以有三个操作,删除,增加或者替换,删除和添加互为逆运算所以操作数相同,而替换,则说明在没有比较这两个数之前进行dp[i-1][j-1]个操作可以使得两个数组相同,那么就只要进行一次替换操作即可。而删除操作则是,删除一个数组里的元素即可,为什么不需要同时删除两个元素,因为如果需要删除两个元素,那么其实可以进行替换操作 

                             dp[i][j] = min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+1))

                         }

                     }

                 }

                 return dp[len(word1)][len(word2)]

}

func min(a,b int) int {

    if a < b {

        return a 

    }else {

        return b 

    }

}

你可能感兴趣的:(算法,数学建模,数据结构)