Java C++刷题leetcode1106解析布尔表达式

yizhihongxing

Java C++刷题leetcode1106解析布尔表达式

问题描述

给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。

有效的表达式需遵循以下约定:

  • "t",运算结果为 True
  • "f",运算结果为 False
  • "!(expr)",运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
  • "&(expr1,expr2,...)",运算过程为对内部表达式 expr1, expr2等进行逻辑 与的运算(AND)
  • "|(expr1,expr2,...)",运算过程为对内部表达式 expr1, expr2等进行逻辑 或的运算(OR)

示例1:

输入:expression = "!(f)"
输出:true

示例2:

输入:expression = "|(t,f)"
输出:true

思路分析

可以用递归的方法来解决这个问题。可以看到,每一个布尔表达式都是由内部表达式或者表达式组成的。所以可以考虑先切分出每个内部表达式,对内部表达式进行计算,再根据组合方式进行整体计算。

具体的做法是,先切分出内部表达式。根据第一个字符是否是"(", "!"或者"t", "f"等来分类。"("表示需要递归计算内部表达式的值,"!"表示需要对当前内部表达式值进行取反的计算,"t"和"f"表示内部表达式值已经确定,无需再进行计算。

对内部表达式计算的方法,与上述方法类似,先根据第一个字符进行分类,递归计算后根据符号进行整体计算。

最后整体计算的时候,根据当前递归到的位置来判断是进行"|"运算还是"&"运算。

代码实现

可以用Java或C++来实现以上逻辑,下面是Java的实现代码(注意代码注释):

class Solution {

    public boolean parseBoolExpr(String expression) {
        char[] expChars = expression.toCharArray();
        int[] idx = {0};
        return calculate(expChars, idx);
    }

    private boolean calculate(char[] chars, int[] idx) {
        // 首先判断当前表达式是由何种内部表达式构成("(", "!", "t"或"f")
        char operator = chars[idx[0]];
        idx[0]++;
        if (operator == 't') {
            return true;
        } else if (operator == 'f') {
            return false;
        } else if (operator == '!') {
            return !calculate(chars, idx);
        } else if (operator == '&') {
            // 递归计算每个内部表达式的值
            boolean result = true;
            boolean end = false;
            while (!end) {
                boolean subExp = calculate(chars, idx);
                result &= subExp;
                char nextChar = chars[idx[0]];
                if (nextChar == ')') {
                    end = true;
                    idx[0]++;
                } else if (nextChar == ',') {
                    idx[0]++;
                }
            }
            return result;
        } else if (operator == '|') {
            // 递归计算每个内部表达式的值
            boolean result = false;
            boolean end = false;
            while (!end) {
                boolean subExp = calculate(chars, idx);
                result |= subExp;
                char nextChar = chars[idx[0]];
                if (nextChar == ')') {
                    end = true;
                    idx[0]++;
                } else if (nextChar == ',') {
                    idx[0]++;
                }
            }
            return result;
        }
        return false;
    }
}

示例说明

以第二个示例为例,输入字符串为"|(t,f)",调用"parseBoolExpr"方法后,实际是递归调用calculate方法,进行如下计算过程:

  1. calculate('|\^'(t,f),1)
  2. calculate(t,2)
  3. 返回true
  4. calculate(f,4)
  5. 返回false
  6. 返回true|false,也就是true

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++刷题leetcode1106解析布尔表达式 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • JDBC对MySQL数据库布尔字段的操作方法

    JDBC是Java Database Connectivity的缩写,是Java语言中处理各种关系型数据库的标准应用程序接口。通过JDBC接口,开发人员可以使用Java语言对数据库进行增、删、改、查的各种操作。本文将针对MySQL数据库中的布尔字段,在JDBC中进行操作的方法,提供一些实用示例。 1. 驱动程序的引入 要使用JDBC对MySQL数据库的操作,…

    Java 2023年6月16日
    00
  • js前台分页显示后端JAVA数据响应

    为了在前台进行分页显示后端Java数据响应,我们需要进行以下步骤: 后端Java代码编写 首先,在后端Java代码中,需要完成以下任务: 获取数据库中的数据。 按照前台请求的分页大小和页码数,对数据进行分页。 将分页后的数据封装成JSON格式的数据,传递给前端。 这些任务可以通过使用Spring Boot框架和MyBatis ORM完成。 举个例子,示例代码…

    Java 2023年6月15日
    00
  • javaweb 项目初始配置的方法步骤

    接下来我将为你详细讲解 JavaWeb 项目初始配置的方法步骤。主要分为以下几步: 搭建开发环境 首先需要安装并配置好 JDK、Tomcat 和 IDE 等环境。具体可参考相关的安装教程。 创建 JavaWeb 项目 打开 IDE,选择新建项目,并选择 JavaWeb 项目。根据 IDE 的提示,填写项目名称、路径等信息,创建一个新的 JavaWeb 项目。…

    Java 2023年5月20日
    00
  • Java实现对一行英文进行单词提取功能示例

    Java实现对一行英文进行单词提取功能 什么是单词提取功能? 在自然语言处理中,我们常常需要将一段英文分成若干个单词,这个过程被称为单词提取。在实际应用中,我们常常需要进行句子分析、文本分类和自然语言生成等任务,这些任务都离不开单词提取。 怎么实现单词提取? 在Java中,我们可以使用正则表达式实现单词的提取。下面是一段Java代码,展示了如何使用正则表达式…

    Java 2023年5月26日
    00
  • Hibernate Validator实现更简洁的参数校验及一个util

    那我来为您讲解一下Hibernate Validator实现更简洁的参数校验及一个util的完整攻略。 1. 简介 Hibernate Validator是一个基于Java Bean验证规范(JSR-303,JSR-349)的校验框架,可以用来校验JavaBean中的字段,包括对基本类型、日期、字符串等数据类型的支持。Hibernate Validator提…

    Java 2023年5月20日
    00
  • Maven Repository仓库的具体使用

    我来为您详细讲解 Maven Repository 仓库的使用攻略。 什么是 Maven Repository Maven Repository(Maven 仓库)是 Maven 使用的一个非常重要的概念。在 Maven 中,一个项目的构建过程中需要用到各种依赖(如 Jar 包、第三方库等),而这些依赖通常可以从 Maven 仓库中获取。Maven 仓库是存…

    Java 2023年5月20日
    00
  • 在 IDEA 中创建 Spring Boot 项目的方式(详细步骤教程)

    开发环境 以下是我的开发环境 JDK 1.8 Maven 3.6.3 IDEA 2019(2019 无所畏惧,即使现在已经 2023 年了哈哈哈) 使用 Maven 的方式创建 Spring Boot 项目 下面的内容可能会因 IDEA 版本不同,而有些选项不同,但是大同小异。 1. 打开 IDEA 点击 Create New Project 2. 点击 M…

    Java 2023年5月11日
    00
  • JAVA如何按字节截取字符串

    截取一个字符串的一部分可以使用 substring() 方法,但是这种方式只能按照字符的数量来截取。如果需要按照字节截取,可以先将字符串转换为字节数组,然后再截取指定的字节数组部分,最后将这个字节数组转换回字符串。 具体的步骤如下: 将字符串转换为字节数组。 可以使用 getBytes() 方法将字符串转换为字节数组,例如: java String str …

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部