給定乙個布林表示式和乙個期望的布林結果 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 個
一、記憶化遞迴
lru_cache可以記錄函式的呼叫結果。
根據結果分類:
result = 1: 0&0 + 0&1 + 1&0/0|0/ 1^1
result = 0: 1&1/1|1 + 0|1 + 1|0/1^ 0 + 0^1
class solution
: and =
'&' or =
'|' xor =
'^' @lru_cache(
none
)def
counteval
(self, s:
str, result:
int)
->
int:
iflen
(s)<=3:
return
int(
eval
(s)== result)
res =
0for i in
range(1
,len
(s),2)
: symbol = s[i]
if result ==0:
if symbol == self.and:
# 0&0 + 0&1 + 1&0
res += self.counteval(s[
:i],0)
*self.counteval(s[i+1:
],0)
+ self.counteval(s[
:i],0)
*self.counteval(s[i+1:
],1)
+ self.counteval(s[
:i],1)
*self.counteval(s[i+1:
],0)
elif symbol == self.or:
# 0|0
res += self.counteval(s[
:i],0)
*self.counteval(s[i+1:
],0)
elif symbol == self.xor:
# 0^0 + 1^1
res += self.counteval(s[
:i],0)
*self.counteval(s[i+1:
],0)
+ self.counteval(s[
:i],1)
*self.counteval(s[i+1:
],1)
else
:if symbol == self.and:
# 1&1
res += self.counteval(s[
:i],1)
*self.counteval(s[i+1:
],1)
elif symbol == self.or:
# 1|1 + 0|1 + 1|0
res += self.counteval(s[
:i],1)
*self.counteval(s[i+1:
],1)
+ self.counteval(s[
:i],0)
*self.counteval(s[i+1:
],1)
+ self.counteval(s[
:i],1)
*self.counteval(s[i+1:
],0)
elif symbol == self.xor:
# 1^0 + 0^1
res += self.counteval(s[
:i],1)
*self.counteval(s[i+1:
],0)
+ self.counteval(s[
:i],0)
*self.counteval(s[i+1:
],1)
return
int(res)
python布林系列 python 布林運算
python學習手冊 讀書筆記 真值測試 在python中 任何非零數字或非空物件都為真 數字零 空物件以及特殊物件none都被認作是假 比較和相等測試會遞迴地應用在資料結構中 比較和相等測試會返回true或false 1和0的特殊版本 布林and和or運算子會返回真或假的操作物件 python中有...
布林運算製做火箭
首先把要製作的火箭看一下 如圖 首先畫兩個橢圓,然後把它們交集獲得乙個這樣的圖形有一點像火箭的身體了 再然後又畫兩個橢圓還是跟剛剛一樣的但是不是交集了,畫出來以後,把乙個橢圓放到另乙個橢圓的上面,然後來乙個減去頂層形狀就行了.又畫乙個橢圓,把橢圓放到有點像火箭的下面,但是橢圓的圖層一定要到火箭圖層的...
布林運算子
a,b 1,2 有乙個為假即為假 print a 1 and b 2 true and true true print a 1 and b 2 true and false false 有乙個為真即為真 print a 1 or b 2 true or true true print a 1 or ...