zoukankan      html  css  js  c++  java
  • DFA

    https://leetcode.com/problems/valid-number/

    使用if-else实现DFA

    class Solution {
    public:
        bool isNumber(string s) {
            while(!s.empty() && s[0] == ' ') {
                s.erase(s.begin());
            }
            while (!s.empty() && s[s.size() - 1] == ' ') {
                s.erase(s.end() - 1);
            }
            if(s.empty()) return false;
            int state = 0;
            for(int i = 0; i < s.size(); i++) {
                if(s[i] == '-' || s[i] == '+') {
                    if(state == 0 || state == 3) {
                        state ++;
                    } else return false;
                } else if(s[i] == '.') {
                    if( state == 2) {
                        state = 7;
                    } else if(state == 0 || state == 1) {
                        state = 6;
                    } else return false;
                } else if(s[i] >= '0' && s[i] <= '9') {
                    if(state == 1 || state == 4 || state == 6) {
                        state ++;
                    } else if(state == 0 || state == 3) {
                        state = state + 2;
                    }
                } else if(s[i] == 'e' || s[i] == 'E') {
                    if(state == 2 ||  state == 7) {
                        state = 3;
                    } else return false;
                } else return false;
            }
            return state == 2 || state == 7 || state == 5;
        }
    };

    使用状态转换表实现DFA

    状态表行代表状态数量,列代表输入类型

    class Solution {
    public:
        int CharIndex(char c) {
            if(c == '+' || c == '-' ) return 0;
            else if(isdigit(c)) return 1;
            else if(c == '.') return 2;
            else if(c == 'e' || c == 'E') return 3;
            else
                return -1;
        }
        bool isNumber(string s) {
            //+,-  digit  dot  exp
            int transfer[8][4] = {
                1, 2, 6, 0,
                0, 2, 6, 0,
                0, 2, 7, 3,
                4, 5, 0, 0,
                0, 5, 0, 0,
                0, 5, 0, 0,
                0, 7, 0, 0,
                0, 7, 0, 3
            };
            // delete preceding space
            while(!s.empty() && s[0] == ' ') {
                s.erase(s.begin());
            }
            while(!s.empty() && s[s.size() - 1] == ' ') {
                s.erase(s.end() - 1);
            }
            // only with space
            if(s.empty()) return false;
            int status = 0;
            for(int ii = 0; ii < s.size(); ii++) {
                int i = CharIndex(s[ii]);
                if(i == -1) return false;
                status = transfer[status][i];
                if(!status) return false;
            }
            return status == 2 || status == 5 || status == 7;
        }
    };

    状态转化图

  • 相关阅读:
    Something broke! (Error 500)——reviewboard
    linux内核--自旋锁的理解
    I.MX6 mkuserimg.sh hacking
    I.MX6 DNS 查看、修改方法
    I.MX6 android mkuserimg.sh
    I.MX6 AW-NB177NF wifi HAL 调试修改
    I.MX6 wpa_supplicant_8 编译问题
    I.MX6 MAC Address hacking
    I.MX6 MAC地址修改
    I.MX6 U-boot imxotp MAC address 写入
  • 原文地址:https://www.cnblogs.com/daijkstra/p/4813147.html
Copyright © 2011-2022 走看看