代码随想录复习 151反转字符串中的单词242 有效的字母异位词 0-1背包问题

这篇具有很好参考价值的文章主要介绍了代码随想录复习 151反转字符串中的单词242 有效的字母异位词 0-1背包问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码如下 

func reverseWords(s string) string {

         b := []byte(s)   

         slowindex,fastindex := 0,0  //设置两个指着,快慢指针

         for len(b) > 0 && fastindex < len(b) && b[fastindex] == ' '{

             fastindex++    //这里是取出开头的空格,逻辑是如果当前指针遍历的是一个空格,那么就继续向后遍历,直到遍历到不是空格的地方,跳出循环

         }

         for ; fastindex < len(b) ; fastindex++ {  // 这个循环的目的是去除中间的空格,逻辑是如果前一个元素和当前元素相等,且为空格,那么就跳过当前元素。否则赋值给慢指针,慢指针记录的是需要的元素 

             if fastindex-1 > 0 && b[fastindex-1] == b[fastindex] && b[fastindex] == ' '{

                 continue 

             }

             b[slowindex] = b[fastindex] 

             slowindex++       //注意的是这里的慢指针会指向最后一个元素的后一个位置

         }

         if slowindex-1 > 0 && b[slowindex-1] == ' '{  //这里是去除最后末尾的空格,有两种情况第一种是最后的元素是空格,第二种情况是最后的元素不是空格 。

             b = b[:slowindex-1]   //如果慢指针的前一个元素是空格,那么就要去掉那个空格

         }else {

             b = b[:slowindex] //如果慢指针的前一个元素不是空格,则直接取到慢指针之前一个元素即可 

         }

         reverse(&b,0,len(b)-1)  //先反转一次字符串

         i := 0  //i表示的是单词的起始位置

         for i < len(b) { //遍历字符串

             j := i  //j表示的是单词的终止位置

             for ; j < len(b)&& b[j] != ' ' ; j++ { //j只要不是空格就向后移动,如果遇到了空格,那么就跳出循环,此时j指向的就是单词结束后的空格 

             }

             reverse(&b,i,j-1) //反转单词

             i = j   

             i++ 

         }

         return string(b)

}文章来源地址https://www.toymoban.com/news/detail-439918.html

func reverse(b *[]byte,left,right int){

    for left < right {

        (*b)[left],(*b)[right] = (*b)[right],(*b)[left]

        left++

        right--

    }

}

242 有效的字母异位词

代码如下 

func isAnagram(s string, t string) bool {

          record := [26]int{}        //思路如下 每个字母与'a'进行相减,得到ASCII码的差值,而 record[s[i]-'a']代表每个不同的字母,并记录每个字母的个数 

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

              record[s[i]-'a']++

          }

          for i := 0 ; i <len(t) ; i++ {  //遍历另一个字符串,如果字母个数相同则返回TRUE

              record[t[i]-'a']--

          }

          if record ==  [26]int{}{

              return true 

          }else {

              return false 

          }

0-1 背包问题 

代码如下

package main

import "fmt"

func main() {

    weight := []int{1, 3, 4}  //设置每个物品的重量,物品的数量等于weight数组的长度

    value := []int{15, 20, 30}

    bagweight := 4

    dp := make([][]int, len(weight))  //数组大小为物品数量

    for i := 0; i < len(dp); i++ { //建立一个物品与背包重量的二维数组

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

    }

    for j := weight[0]; j <= bagweight; j++ {  //初始化,从背包等于物品0的重量,到总的背包重量

        dp[0][j] = value[0]

    }

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

        for j := 0; j <= bagweight; j++ {

            if j < weight[i] {   //如果背包重量小于当前物品重量,则不放入该物品

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

            } else {

                dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) //否则,则是在不放与放之间取一个最大值,且如果要放这个物品,那么之前背包的最大值应该是当前背包容量减去该物品的容量,在这个容量之下,i-1个物品的最大价值

            }

        }

    }

    fmt.Println(dp[len(weight)-1][bagweight])

}

func max(a, b int) int {

    if a > b {

        return a

    } else {

        return b

    }

}

到了这里,关于代码随想录复习 151反转字符串中的单词242 有效的字母异位词 0-1背包问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录 字符串 Java

    复杂度分析: 时间复杂度:O(N),其中N为字符数组的长度。一共执行了N/2次的交换 空间复杂度:O(1),只使用了常数空间来存放若干变量 我的思路:2k个字符为一组,先将前k个字符(或者不足k个字符)添加到StringBuilder中,然后调用reverse()方法,然后再将后k个字符(或者不足

    2024年02月06日
    浏览(38)
  • 代码随想录笔记--字符串篇

    目录 1--反转字符串 2--反转字符串II 3--反转字符串中的单词 4--KMP算法 5--重复的子字符串 主要思路:         双指针算法,交换两个指针的字符; 主要思路:         以 2k 个字符为一组进行遍历; 主要思路1:         遍历提取每一个有效的单词,存储在一个栈中,最后遍

    2024年02月10日
    浏览(65)
  • 代码随想录字符串专题复盘day15

    KMP算法 KMP算法的经典思想就是:当出现字符串不匹配的时候,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配 前缀表 next数组就是一个前缀表 前缀表是用来回退的,它记录了模式串与主串不匹配的时候,模式串应该从哪里开始重新匹配 前缀表的

    2024年01月20日
    浏览(47)
  • 代码随想录 Leetcode459. 重复的子字符串(KMP算法)

            此解法读者需要了解什么是KMP算法以及KMP算法中next数组的具体含义才能理解         因为在KMP算法的next数组中,next[index]表示 i ndex之前的最大长度的相同前缀后缀值 ,那么要判断整个字符串中是否由重复字串构成,只需要以下两个条件:         1.next[n - 1] !=

    2024年01月19日
    浏览(74)
  • 代码随想录第五十六天——两个字符串的删除操作,编辑距离

    题目链接:两个字符串的删除操作 两个字符串可以相互删除 版本一: 确定dp数组及下标的含义 dp[i][j] :以i-1为结尾的字符串word1,和以j-1为结尾的字符串word2,想要达到相等,所需要删除元素的最少次数 确定递推公式 (1)当word1[i - 1] 与 word2[j - 1]相同: (2)当word1[i - 1] 与

    2024年02月02日
    浏览(36)
  • 代码随想录 Leetcode1047. 删除字符串中的所有相邻重复项

            时间复杂度高         写完代码多思考怎么优化

    2024年01月22日
    浏览(52)
  • 代码随想录day9|实现strStr()、重复的子字符串

    一般的字符串匹配问题我们可以使用KMP算法来处理,当我们搜索文本串和模式串是否匹配的时候,我们先得到模式串的一个前缀表,其中前缀表中存放的内容是模式串的最长相等前后缀。例如文本串为:aabaabaafa,模式串为:aabaaf,那么文本串的前缀表就是010120。当我们开始搜

    2024年02月15日
    浏览(62)
  • 代码随想录打卡第56天|583. 两个字符串的删除操作;72. 编辑距离

    583. 两个字符串的删除操作 关键点1:dp数组的含义 dp[i][j],使得以i-1为结尾word1 和 以j-1为结尾的word2 相同所需的最小步数; 关键点2:递归公式的推导 if(nums1[i-1] == nums2[j-1]),则i和j同时移动,所以为i-1,j-1;dp[i][j] = dp[i-1][j-1];由于不需要进行删除操作,所以不需要加1 如果不相

    2023年04月19日
    浏览(48)
  • 1月3日代码随想录反转二叉树

    给你一棵二叉树的根节点  root  ,翻转这棵二叉树,并返回其根节点。 示例 1: 示例 2: 示例 3: 提示: 树中节点数目范围在  [0, 100]  内 -100 = Node.val = 100 这道题用递归的思想就是将根节点的左右儿子交换,然后再对子节点进行递归操作,直到子节点均为空。 但是我感觉

    2024年02月03日
    浏览(44)
  • 代码随想录第十一天 | ​​​​​​LeetCode 20. 有效的括号、​​​​​​LeetCode 1047. 删除字符串中的所有相邻重复项、​​​​​​LeetCode 150. 逆波兰表达式求

    目录 ​​​​​​LeetCode 20. 有效的括号 文章讲解:代码随想录(programmercarl.com) 视频讲解:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 1047. 删除字符串中的所有相邻重复项 文章讲解:代码随想录(programmercarl.com) 视频讲解:栈的好戏还

    2024年02月22日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包