推广 热搜: 收购ACF  石英加热管,  800  T型槽试验平台  求购ACF  深圳回收ACF  回收ACF  T型槽装配平台  求购日立ACF  T型槽地梁 

程序员必备的算法(程序员面试金典08.14)

   日期:2023-06-16     浏览:51    评论:0    
核心提示:题目 给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成。实现一个函数,算出有几
题目

给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、

| (OR) 和 ^ (XOR) 符号组成。实现一个函数,算出有几种可使该表达式得出 result 值的括号方法。

示例 1:输入: s = "1^0|0|1", result = 0 输出: 2

解释: 两种可能的括号方法是

1^(0|(0|1))

1^((0|0)|1)

示例 2:输入: s = "0&0&0&1^1|0", result = 1 输出: 10

提示:运算符的数量不超过 19 个

解题思路分析

1、动态规划;时间复杂度O(n^3),空间复杂度O(n^2)

func counteval(s string, result int) int {n := len(s)// dp[i][j][0/1] => s[i:j 1]结果为0/1的方法数dp := make([][][2]int, n)for i := 0; i < n; i {dp[i] = make([][2]int, n)}for i := n - 1; i >= 0; i = i - 2 {for j := i; j < n; j = j 2 {if i == j {if s[i] == '0' {dp[i][j][0] } else {dp[i][j][1] }continue}for k := i 1; k < j; k = k 2 { // 枚举操作符for a := 0; a <= 1; a {for b := 0; b <= 1; b {if getValue(a, b, s[k]) == 0 {dp[i][j][0] = dp[i][j][0] dp[i][k-1][a]*dp[k 1][j][b]} else {dp[i][j][1] = dp[i][j][01] dp[i][k-1][a]*dp[k 1][j][b]}}}}}}return dp[0][n-1][result]}func getValue(a, b int, op byte) int {if op == '&' {return a & b} else if op == '|' {return a | b}return a ^ b}

2、动态规划;时间复杂度O(n^3),空间复杂度O(n^2)

程序员必备的算法(程序员面试金典08.14)(1)

func counteval(s string, result int) int {n := len(s)// dp[i][j][0/1] => s[i:j 1]结果为0/1的方法数dp := make([][][2]int, n)for i := 0; i < n; i {dp[i] = make([][2]int, n)}for i := n - 1; i >= 0; i = i - 2 {for j := i; j < n; j = j 2 {if i == j {dp[i][j][s[i]-'0'] continue}for k := i 1; k < j; k = k 2 { // 枚举操作符for a := 0; a <= 1; a {for b := 0; b <= 1; b {temp := getValue(a, b, s[k])dp[i][j][temp] = dp[i][j][temp] dp[i][k-1][a]*dp[k 1][j][b]}}}}}return dp[0][n-1][result]}func getValue(a, b int, op byte) int {if op == '&' {return a & b} else if op == '|' {return a | b}return a ^ b}

3、动态规划;时间复杂度O(n^3),空间复杂度O(n^2)

func counteval(s string, result int) int {n := len(s)// dp[i][j][0/1] => s[i:j 1]结果为0/1的方法数dp := make([][][2]int, n)for i := 0; i < n; i {dp[i] = make([][2]int, n)if i%2 == 0 {dp[i][i][int(s[i]-'0')] }}for length := 2; length <= n; length = length 2 { // 枚举长度for i := 0; i <= n-length; i = i 2 { // 枚举起点j := i length // 确定终点for k := i 1; k < j; k = k 2 { // 枚举操作符for a := 0; a <= 1; a {for b := 0; b <= 1; b {temp := getValue(a, b, s[k])dp[i][j][temp] = dp[i][j][temp] dp[i][k-1][a]*dp[k 1][j][b]}}}}}return dp[0][n-1][result]}func getValue(a, b int, op byte) int {if op == '&' {return a & b} else if op == '|' {return a | b}return a ^ b}

总结

Medium题目,采用动态规划

,
原文链接:http://b.souke.org/news/show-105186.html,转载和复制请保留此链接。
以上就是关于程序员必备的算法(程序员面试金典08.14)全部的内容,关注我们,带您了解更多相关内容。
 
标签: 复杂度 方法 布尔
打赏
 
更多>同类资讯
0相关评论

推荐资讯
网站首页  |  VIP套餐介绍  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  SITEMAPS  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报