LeetCode224基本計算器用DFA實現超簡潔

2021-10-22 15:18:25 字數 1418 閱讀 2597

題目是:給你乙個字串表示式 s ,請你實現乙個基本計算器來計算並返回它的值。

比如:

輸入:s = "(1+(4+5+2)-3)+(6+8)"

輸出:23

這題有點類似編譯器設計,特點是狀態很多,很容易迷失在if-else中,所以使用有限狀態機dfa來解決

dfa(deterministic finite automation)就是一系列狀態的遷移,大家可以試著畫下圖,就如下4種狀態轉來轉去,很簡單的

上圖中我畫了起始態的遷移示例(紅色字型),符號態的遷移示例(藍色字型),其他不畫了,道理一樣的,大家也可以自己畫下

狀態0-start 世界起始態;

1-sig 置加號或減號的狀態;

2-number 輸入數字時狀態;

3-end 世界結束態;

遷移條件:輸入的字元的種類驅動了狀態遷移

0是(1+或-2是數字3是)4是其他非法字元

注意事項:

空格事先去掉,簡化**

起始態和結束態,不僅是字串開始和結束,"("號也會開始乙個新的世界,原來的世界入棧

/**

* @param s

* @return

*/const

dfa=[[

0,1,

2,3,

3],//當狀態是起始態時,遇到各種字元型別所跳轉到的下個狀態,比如0是(,遇到0還是起始態,只不過是下個世界的[0

,3,2

,3,3

],[3

,1,2

,3,3

],[3

,1,3

,3,3

]];//字元分類子函式:返回字元的型別 0是( 1 +或- 2是數字 3是) 4是其他非法字元

const

classify

=function

(c)var

calculate

=function

(s))

; accm =0;

flag =

true

; val =0;

}else

if(transit ===1)

else

if(transit ===2)

else

status = transit;

}return accm +

(flag ? val :

-val);}

;

leetcode 224 基本計算器

題目 基本計算器 實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式可以包含左括號 右括號 加號 減號 非負整數和空格 示例1 輸入 1 1 輸出 2 示例2 輸入 2 1 2 輸出 3 示例3 輸入 1 4 5 2 3 6 8 輸出 23 說明 c include include cl...

leetcode 224 基本計算器

實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式可以包含左括號 右括號 加號 減號 非負整數和空格 示例 1 輸入 1 1 輸出 2 示例 2 輸入 2 1 2 輸出 3 示例 3 輸入 1 4 5 2 3 6 8 輸出 23 採用雙棧法,設立乙個資料棧和乙個操作符棧,在遍歷字串的過程...

Leetcode 224基本計算器

邏輯先寫第三步再寫第二步,思考時要按照表示式順序先看數字再看右括號正常考慮,時間複雜度o n class solution intcalculate string s else 遇到數字 nums.push n 處理多位數等價寫法 while j s.size isdigit s j j j i c...