Deterministic Finite Automaton
自動機
主要是要明確 :
- 條件
- 狀態
比如: leetCode8. 字符串轉換整數 (atoi)
其中表格狀態可以用unordered_map
構造,並且用一個state(int)記錄當前的行
狀態, get_col(char c)獲取列
狀態,table獲取state行狀態。
於是可以寫出代碼:
class Automation{
int state=1;
unordered_map<int,vector<int> > table={
{1,{1,2,3,4}},
{2,{4,4,3,4}},
{3,{4,4,3,4}},
{4,{4,4,4,4}}
};
int get_col(char c)
{
if(isspace(c))return 0;
if(c=='+'||c=='-')return 1;
if(isdigit(c)) return 2;
return 3;
}
public:
int sign=1;
long long res=0;
bool run(char c)
{
state=table[state][get_col(c)];
if(state==3){
res=res*10+c-'0';
res=sign==1?min(res,(long long)INT_MAX):min(res,-1*(long long)INT_MIN);
}else if(state==2){
sign=c=='-'?-1:1;
}else if(state==4){
return false;
}return true;
}
};
class Solution {
public:
int myAtoi(string str) {
Automation a;
for(char c:str){
if(!a.run(c))break;
}
return a.sign*a.res;
}
};