Golang每日一练(leetDay0090) 运算优先级、有效字母异位词

简介: Golang每日一练(leetDay0090) 运算优先级、有效字母异位词

241. 为运算表达式设计优先级 Different Ways to Add Parentheses

给你一个由数字和运算符组成的字符串 expression ,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以 按任意顺序 返回答案。

示例 1:

输入:expression = "2-1-1"

输出:[0,2]

解释:

((2-1)-1) = 0

(2-(1-1)) = 2


示例 2:

输入:expression = "2*3-4*5"

输出:[-34,-14,-10,-10,10]

解释:

(2*(3-(4*5))) = -34

((2*3)-(4*5)) = -14

((2*(3-4))*5) = -10

(2*((3-4)*5)) = -10

(((2*3)-4)*5) = 10


提示:

  • 1 <= expression.length <= 20
  • expression 由数字和算符 '+''-''*' 组成。
  • 输入表达式中的所有整数值在范围 [0, 99]

代码1:

package main
import (
  "fmt"
  "strconv"
)
func diffWaysToCompute(expression string) []int {
  var res []int
  for i := 0; i < len(expression); i++ {
    if expression[i] == '+' || expression[i] == '-' || expression[i] == '*' {
      leftRes := diffWaysToCompute(expression[:i])
      rightRes := diffWaysToCompute(expression[i+1:])
      for _, a := range leftRes {
        for _, b := range rightRes {
          switch expression[i] {
          case '+':
            res = append(res, a+b)
          case '-':
            res = append(res, a-b)
          case '*':
            res = append(res, a*b)
          }
        }
      }
    }
  }
  if len(res) == 0 {
    num, _ := strconv.Atoi(expression)
    res = append(res, num)
  }
  return res
}
func main() {
  expression := "2-1-1"
  fmt.Println(diffWaysToCompute(expression))
  expression = "2*3-4*5"
  fmt.Println(diffWaysToCompute(expression))
}

输出:

[2 0]

[-34 -10 -14 -10 10]

代码2:

package main
import (
  "fmt"
  "strconv"
)
func diffWaysToCompute(expression string) []int {
    memo := make(map[string][]int)
    var dfs func(string) []int
    dfs = func(exp string) []int {
        if res, ok := memo[exp]; ok {
            return res
        }
        var res []int
        for i := 0; i < len(exp); i++ {
            if exp[i] == '+' || exp[i] == '-' || exp[i] == '*' {
                leftRes := dfs(exp[:i])
                rightRes := dfs(exp[i+1:])
                for _, a := range leftRes {
                    for _, b := range rightRes {
                        switch exp[i] {
                        case '+':
                            res = append(res, a+b)
                        case '-':
                            res = append(res, a-b)
                        case '*':
                            res = append(res, a*b)
                        }
                    }
                }
            }
        }
        if len(res) == 0 {
            num, _ := strconv.Atoi(exp)
            res = append(res, num)
        }
        memo[exp] = res
        return res
    }
    return dfs(expression)
}
func main() {
  expression := "2-1-1"
  fmt.Println(diffWaysToCompute(expression))
  expression = "2*3-4*5"
  fmt.Println(diffWaysToCompute(expression))
}

输出:

[2 0]

[-34 -10 -14 -10 10]

代码3:

package main
import "fmt"
func diffWaysToCompute(expression string) []int {
  nums := make([]int, 0) // 记录数字
  ops := make([]byte, 0) // 记录运算符
  num := 0
  for i := 0; i < len(expression); i++ {
    if expression[i] == '+' || expression[i] == '-' || expression[i] == '*' {
      ops = append(ops, expression[i])
      nums = append(nums, num)
      num = 0
    } else {
      num = num*10 + int(expression[i]-'0')
    }
  }
  nums = append(nums, num)
  n := len(nums)
  dp := make([][][]int, n)
  for i := 0; i < n; i++ {
    dp[i] = make([][]int, n)
    for j := 0; j < n; j++ {
      dp[i][j] = make([]int, 0)
    }
  }
  for i := 0; i < n; i++ {
    dp[i][i] = append(dp[i][i], nums[i])
  }
  for len := 2; len <= n; len++ {
    for i := 0; i <= n-len; i++ {
      j := i + len - 1
      for k := i; k < j; k++ {
        leftRes := dp[i][k]
        rightRes := dp[k+1][j]
        for _, a := range leftRes {
          for _, b := range rightRes {
            switch ops[k] {
            case '+':
              dp[i][j] = append(dp[i][j], a+b)
            case '-':
              dp[i][j] = append(dp[i][j], a-b)
            case '*':
              dp[i][j] = append(dp[i][j], a*b)
            }
          }
        }
      }
    }
  }
  return dp[0][n-1]
}
func main() {
  expression := "2-1-1"
  fmt.Println(diffWaysToCompute(expression))
  expression = "2*3-4*5"
  fmt.Println(diffWaysToCompute(expression))
}

输出:

[2 0]

[-34 -10 -14 -10 10]


242. 有效的字母异位词 Valid Anagram

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

示例 1:

输入:s = "anagram", t = "nagaram"

输出: true


示例 2:

输入:s = "rat", t = "car"

输出: false


提示:

  • 1 <= s.length, t.length <= 5 * 10^4
  • st 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

代码1:

package main
import "fmt"
func isAnagram(s string, t string) bool {
  if len(s) != len(t) {
    return false
  }
  table := make(map[rune]int, 26)
  for _, c := range s {
    table[c]++
  }
  for _, c := range t {
    table[c]--
    if table[c] < 0 {
      return false
    }
  }
  return true
}
func main() {
  s := "anagram"
  t := "nagaram"
  fmt.Println(isAnagram(s, t))
  s = "rat"
  t = "car"
  fmt.Println(isAnagram(s, t))
}

代码2:

package main
import "fmt"
func isAnagram(s string, t string) bool {
  if len(s) != len(t) {
    return false
  }
  table := [26]int{}
  for i := 0; i < len(s); i++ {
    table[s[i]-'a']++
  }
  for i := 0; i < len(t); i++ {
    table[t[i]-'a']--
    if table[t[i]-'a'] < 0 {
      return false
    }
  }
  return true
}
func main() {
  s := "anagram"
  t := "nagaram"
  fmt.Println(isAnagram(s, t))
  s = "rat"
  t = "car"
  fmt.Println(isAnagram(s, t))
}

代码3:

package main
import "fmt"
import "sort"
type byteSlice []byte
func (b byteSlice) Len() int { return len(b) }
func (b byteSlice) Less(i, j int) bool { return b[i] < b[j] }
func (b byteSlice) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
func isAnagram(s string, t string) bool {
    if len(s) != len(t) {
        return false
    }
    sArr := []byte(s)
    tArr := []byte(t)
    sort.Sort(byteSlice(sArr))
    sort.Sort(byteSlice(tArr))
    for i := 0; i < len(sArr); i++ {
        if sArr[i] != tArr[i] {
            return false
        }
    }
    return true
}
func main() {
  s := "anagram"
  t := "nagaram"
  fmt.Println(isAnagram(s, t))
  s = "rat"
  t = "car"
  fmt.Println(isAnagram(s, t))
}

输出:

true

false


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更


目录
相关文章
|
4月前
|
Go
Golang语言常用的操作符优先级及获取用户终端输入的两种方式
这篇文章介绍了Golang语言中常用的算术、赋值、关系、逻辑、位运算符以及指针运算符的使用,运算符优先级,以及如何通过Scanln和Scanf函数获取用户终端输入的两种方式。
29 0
|
8月前
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
102 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
8月前
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
70 0
Linux 终端命令之文件浏览(2) more
|
8月前
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
84 0
Linux 终端操作命令(2)内部命令
|
8月前
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
74 0
力扣 C++|一题多解之动态规划专题(2)
|
8月前
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
84 0
Python Numpy入门基础(一)创建数组
|
8月前
|
Java 容器 程序员
Java语言程序设计试卷6套
Java语言程序设计试卷6套
931 0
Java语言程序设计试卷6套
|
8月前
|
Java Go C++
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
77 0
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
|
4月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
161 4
Golang语言之管道channel快速入门篇
|
4月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
81 4
Golang语言文件操作快速入门篇