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;
        }
    };

    状态转化图

  • 相关阅读:
    [转]Ubuntu设置Redhat风格的SHELL提示符PS1属性
    [转]Ubuntu Adsl 上网
    [转]Bash中的PS1详解
    Verilog 关于用task仿真应注意的一个问题
    [转]提高编程技能最有效的方法
    [转]ubuntu 终端常用命令
    [转]VMware Workstation 7.1 正式版 For Linux
    [转]Vim基本操作
    [转]Ubuntu Linux下设置IP的配置命令
    xilinxftp.newlocation
  • 原文地址:https://www.cnblogs.com/daijkstra/p/4813147.html
Copyright © 2011-2022 走看看