您现在的位置是:首页 >技术杂谈 >代码随想录补打卡 392 判断子序列 53 最大子数组和 115 不同的子序列网站首页技术杂谈

代码随想录补打卡 392 判断子序列 53 最大子数组和 115 不同的子序列

倒酒小生 2024-07-01 11:59:47
简介代码随想录补打卡 392 判断子序列 53 最大子数组和 115 不同的子序列

392 判断子序列 

代码如下 

func isSubsequence(s string, t string) bool {   //dp[i][j]数组的含义是到下标i-1和到下标j-1相同子序列的长度

           dp := make([][]int,len(s)+1)    设置二维数组

           for i,_ := range dp {

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

           }

           for i := 1 ; i <= len(s) ; i++ {     遍历数组

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

                   if s[i-1] == t[j-1] {    如果元素相同 

                       dp[i][j] = dp[i-1][j-1]+1 则说明相同的子序列长度需要加上该元素,即在没有算上该元素的长度上加1 

                   }else {

                       dp[i][j] = dp[i][j-1]    如果不相同,则要去除掉t序列,即较长数组的当前一个元素,继续匹配

                   }

               }

           }

           if dp[len(s)][len(t)] == len(s) {  如果最终的结果是相同子序列长度和s即较短的数组长度一致,说明较短数组是长数组的子序列 

               return true 

           }else {

               return false 

           }

}

53 最大数组和 

func maxSubArray(nums []int) int {

          dp := make([]int,len(nums))  dp数组的含义是到当前下标,数组的和

          dp[0] = nums[0]      

          res := dp[0]   记录一个最大值 

          for i := 1 ; i < len(nums) ; i++ { 遍历数组

              dp[i] = max(dp[i-1]+nums[i],nums[i])  当前数组的和有两种可能一种是到前一个元素的和加上当前元素,或者是直接算当前元素,取两者较大的值

              if dp[i] > res {

                  res = dp[i]

              }

          }

          return res 

}

func max(a,b int) int {

    if a > b {

        return a

    }else {

        return b 

    }

}

115 不同的子序列

代码如下

func numDistinct(s string, t string) int {

             dp := make([][]int,len(s)+1)    dp数组的含义是以i-1为结尾的s中出现以j-1为结尾的t数组的个数,举例来说  s为 abcaaa t为a 则在s数组中,出现t的个数为4 

             for i,_ := range dp {

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

             }

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

                 dp[i][0] = 1        dp[i][0] 表示t数组为空,则说明个数为1个

             }

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

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

                     if s[i-1] == t[j-1] {  如果当前元素相同,则有两种可能,一种是放入这两个元素,其个数则等于在没放入两个元素之前的数组的 举例来说 s为babg t为bag 在最后同时放入g时,他的结果等于bab 中出现ba的个数 第二种可能是在长数组中不放入这个元素,在短数组放入这个元素,放入元素后的新数组出现在原来的长数组中,举例来说bagbbg 和 bag 当两个数组都要放入最后的g时,长数组可以不放入g因为之前已经有出现过bag

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

                     }else {

                         dp[i][j] = dp[i-1][j]     //如果两个元素不相同,则要去除掉长数组中的元素继续匹配,举例来说,bagbbg和bag,当放入b和g时两个元素不同则要,去除掉b,因为根据定义要在长数组中找到bag出现的个数,但是当前这个b元素在数组中没有按顺序出现即没有在a后面出现,所以需要去除

                     }

                 }

             }

             return dp[len(s)][len(t)]

}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。