• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

[Swift]LeetCode1106.解析布尔表达式|ParsingABooleanExpression

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

Return the result of evaluating a given boolean expression, represented as a string.

An expression can either be:

  • "t", evaluating to True;
  • "f", evaluating to False;
  • "!(expr)", evaluating to the logical NOT of the inner expression expr;
  • "&(expr1,expr2,...)", evaluating to the logical AND of 2 or more inner expressions expr1, expr2, ...;
  • "|(expr1,expr2,...)", evaluating to the logical OR of 2 or more inner expressions expr1, expr2, ... 

Example 1:

Input: expression = "!(f)"
Output: true

Example 2:

Input: expression = "|(f,t)"
Output: true

Example 3:

Input: expression = "&(t,f)"
Output: false

Example 4:

Input: expression = "|(&(t,f,t),!(t))"
Output: false 

Constraints:

  • 1 <= expression.length <= 20000
  • expression[i] consists of characters in {'(', ')', '&', '|', '!', 't', 'f', ','}.
  • expression is a valid expression representing a boolean, as given in the description.

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

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:expression = "&(t,f)"
输出:false

示例 4:

输入:expression = "|(&(t,f,t),!(t))"
输出:false 

提示:

  • 1 <= expression.length <= 20000
  • expression[i] 由 {'(', ')', '&', '|', '!', 't', 'f', ','} 中的字符组成。
  • expression 是以上述形式给出的有效表达式,表示一个布尔值。

Runtime: 32 ms
Memory Usage: 20.8 MB
 1 class Solution {
 2     func parseBoolExpr(_ expression: String) -> Bool {
 3         var op:[Character] = [Character]()
 4         var num:[Int] = [Int]()
 5         for ch in expression
 6         {
 7             if ch == "t" {num.append(1)}
 8             else if ch == "f" {num.append(0)}
 9             else if (ch == "|") || (ch == "&") || (ch == "!") {op.append(ch)}
10             else if ch == "(" {num.append(-1)}
11             else if ch == "," {continue}
12             else if ch == ")"
13             {
14                 var ans:Int = num.popLast()!
15                 let p:Character = op.popLast()!
16                 while(num.last! != -1)
17                 {
18                     let a:Int = num.popLast()!
19                     if p == "&" {ans = ans & a}
20                     else if p == "|" {ans = ans | a}
21                 }
22                 num.popLast()
23                 if p == "!" {ans =  1 - ans}
24                 num.append(ans)
25             }
26         }
27         if num.last! == 1
28         {
29             return true
30         }
31         return false
32     }
33 }

 


72ms

 

 1 class Solution {
 2     var expressions : [Character] = ["&","|","!"]
 3     var bools : [Character] = ["t","f"]
 4     func parseBoolExpr(_ expression: String) -> Bool {
 5         var stack : String = ""
 6         let expression = Array(expression)
 7         
 8         _ = true
 9         var currentBools = [Character]()
10         for i in 0..<expression.count {
11             
12             if expression[i] == ")" {
13                 while let head = stack.popLast(), head != "(" {
14                     if head == "t" || head == "f" {
15                         currentBools.append(head)
16                     }
17                 }
18                 if let op = stack.popLast() {
19                     if op == "&" {
20                         stack.append(evaluateAND(currentBools))
21                         currentBools.removeAll()
22                     } else if op == "|" {
23                         stack.append(evaluateOR(currentBools))
24                         currentBools.removeAll()
25                     } else if op == "!" {
26                         stack.append(evaluateNot(currentBools.first!))
27                         currentBools.removeAll()
28                     }
29                     continue
30                 }
31             }
32             if bools.contains(expression[i]) {
33                 currentBools.append(expression[i])
34                 continue
35             }
36             
37             stack.append(expression[i])
38         }
39         if stack.popLast() == "t" {return true}
40         return false
41     }
42     
43     func evaluateOR (_ input: [Character]) -> Character {
44         if input.contains("t") {return "t"}
45         return "f"
46     }
47     
48     func evaluateAND (_ input: [Character]) -> Character {
49         if input.contains("f") {return "f"}
50         return "t"
51     }
52     
53     func evaluateNot(_ input: Character) -> Character {
54         if input == ("f") {return "t"}
55         return "f"
56     }
57 }

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap