Leetcode-每日一题1106. 解析布尔表达式(DFS模拟栈)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 题目意思很简单让你去判断与或非布尔表达式的结果,我们可以看布尔表达式看成一棵树,需要我们解决的是从最底层的嵌套布尔表达式产生的结果不断向上的结果

66c2388c5dc04db1826607589cf3eb9b.png


题目链接:点击跳转


思路


方法一、DFS模拟栈


题目意思很简单让你去判断与或非布尔表达式的结果,我们可以看布尔表达式看成一棵树,需要我们解决的是从最底层的嵌套布尔表达式产生的结果不断向上的结果,如图:


b1c2d0e7fd314911b5d3073cf1af3a28.png


既然他是一棵树且我需要从叶结点往上,肯定能看出来直接用DFS遍历树不就好了吗,接下来要解决的问题就是怎么区分他的每个结点:


  • 如果是t、r则我们直接返回结果。


  • 在&、|布尔表达式中存在多个结点(内部表达式),每个结点(内部表达式)用,分割,需要注意我们不能直接用,来区分,因为可能存在嵌套的子树(内部表达式)那表达式怎么区分呢?


。其实仔细一看这不就是括号匹配么 ,我们用栈不就可以解决了么!

。所以我们只需要建立两个变量lcnt,rcnt分别表示左括号数量和右括号数量


  • 如果 lcnt - 1 == rcnt,表示当前这个内部表达式是一颗嵌套的子树。用DFS递归去解决


  • 如果 lcnt == rcnt,表示我们这个内部表达式已经结束了,用DFS递归去解决最后一个结点即可,将产生的结果向上传递返回。


  • 在&的布尔表达式中,如果出现了一个false那整个表达式就是false,我们可以用标记记录即可。


  • 在|的布尔表达式中,如果出现了一个true那整个表达式就是true,我们可以用标记记录即可。


  • 剩下的细节完善一下即可。


代码示例


func parseBoolExpr(s string) bool {
  if s[0] == 't' {
    return true
  } else if s[0] == 'f' {
    return false
  } else if s[0] == '!' {
    if parseBoolExpr(s[2:]) {
      return false
    } else {
      return true
    }
  } else if s[0] == '&' {
    l, r, lcnt, rcnt, f := 2, 2, 1, 0, 1
    for lcnt != rcnt && r < len(s) {
      if s[r] == ',' && lcnt-1 == rcnt {
        if !parseBoolExpr(s[l:r]) {
          f = 0
        }
        l = r + 1
      } else if s[r] == '(' {
        lcnt++
      } else if s[r] == ')' {
        rcnt++
        if lcnt == rcnt {
          if !parseBoolExpr(s[l:r]) {
            f = 0
          }
        }
      }
      r++
    }
    if f == 1 {
      return true
    } else {
      return false
    }
  } else if s[0] == '|' {
    l, r, lcnt, rcnt, f := 2, 2, 1, 0, 0
    for lcnt != rcnt && r < len(s) {
      if s[r] == ',' && lcnt-1 == rcnt {
        if parseBoolExpr(s[l:r]) {
          f = 1
        }
        l = r + 1
      } else if s[r] == '(' {
        lcnt++
      } else if s[r] == ')' {
        rcnt++
        if lcnt == rcnt {
          if parseBoolExpr(s[l:r]) {
            f = 1
          }
        }
      }
      r++
    }
    if f == 1 {
      return true
    } else {
      return false
    }
  }
  return true
}

f18d7e3e81db475bb1711750512f269b.png


复杂度分析


  • 时间复杂度:O(n),其中n表示 s 字符串的长度,遍历一遍字符串需要O(n)的时间。
  • 空间复杂度:O(1),不需要申请额外的空间
目录
相关文章
|
2月前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
102 52
|
3月前
|
数据格式
常用的Lambda表达式案例解析,工作中都会用到!
常用的Lambda表达式案例解析,工作中都会用到!
|
3月前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
17 0
|
3月前
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
26 0
|
5月前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
4月前
|
分布式计算 Java API
深入解析Java中的Lambda表达式及其应用
本文将深入探讨Java中Lambda表达式的定义、优势及其在实际编程中的应用。通过具体示例,帮助读者更好地理解和使用这一强大的编程工具。
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
36 4
|
5月前
|
JSON 数据格式 索引
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2

推荐镜像

更多