Valid Number
Validate if a given string is numeric.
Some examples:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
这题很无聊。
1 public class Solution { 2 public boolean isNumber(String s) { 3 // Start typing your Java solution below 4 // DO NOT write main() function 5 if(s.trim().isEmpty()){ 6 return false; 7 } 8 String regex = "[-+]?(\\d+\\.?|\\.\\d+)\\d*(e[-+]?\\d+)?"; 9 if(s.trim().matches(regex)){ 10 return true; 11 }else{ 12 return false; 13 } 14 } 15 }
解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较优雅。本文参考了http://blog.csdn.net/kenden23/article/details/18696083里面的内容,在此致谢!
首先这个题有9种状态:
0初始无输入或者只有space的状态
1输入了数字之后的状态
2前面无数字,只输入了dot的状态
3输入了符号状态
4前面有数字和有dot的状态
5'e' or 'E'输入后的状态
6输入e之后输入Sign的状态
7输入e后输入数字的状态
8前面有有效数输入之后,输入space的状态
共9种状态了,难设计的是6,7,8状态。
分好之后就好办了,设计出根据输入进行状态转换就OK了。
这里的输入可以分:
INVALID=0;#无效输入包括: Alphas, '(', '&' ans so on
SPACE=1
SIGN=2 # '+' or '-'
DIGIT=3 # numbers
DOT=4 # '.'
EXPONENT=5 # 'e' or 'E'
转移矩阵A(9X6)如下:
-1, 0, 3, 1, 2, -1
-1, 8, -1, 1, 4, 5
-1, -1, -1, 4, -1, -1
-1, -1, -1, 1, 2, -1
-1, 8, -1, 4, -1, 5
-1, -1, 6, 7, -1, -1
-1, -1, -1, 7, -1, -1
-1, 8, -1, 7, -1, -1
-1, 8, -1, -1, -1, -1
行代表了9种状态,列代表了6种输入方式也就是6种跳转方式。举个例子:A[0][2]=3,这有什么含义呢?意思是:第0种状态为【0初始无输入或者只有space的状态】,在输入第2种输入【SIGN=2 # '+' or '-'】后,会跳转到第3种状态【3输入了符号状态】。A[1][1]=8是什么意思呢?意思是:第1种状态为【1输入了数字之后的状态】,在输入第1种输入【SPACE=1】后,跳转到了第8种状态【8前面有有效数输入之后,输入space的状态】。
根据以上的解释,大家应该明白什么事状态间的跳转了,这个共9种状态,所以是确定有穷自动机。其实难点在于状态的分割,要把每种情况都想到。
而这9种状态中:只有1、4、7、8这四种状态合法,所以最后state跳转到这四种状态之一时,说明输入是合法的!
状态转移图 from leetcode discuss:
1 class Solution: 2 # @param s, a string 3 # @return a boolean 4 # @finite automation 5 def isNumber(self, s): 6 INVALID=0; SPACE=1; SIGN=2; DIGIT=3; DOT=4; EXPONENT=5; 7 #0invalid,1space,2sign,3digit,4dot,5exponent,6num_inputs 8 transitionTable=[[-1, 0, 3, 1, 2, -1], #0 no input or just spaces 9 [-1, 8, -1, 1, 4, 5], #1 input is digits 10 [-1, -1, -1, 4, -1, -1], #2 no digits in front just Dot 11 [-1, -1, -1, 1, 2, -1], #3 sign 12 [-1, 8, -1, 4, -1, 5], #4 digits and dot in front 13 [-1, -1, 6, 7, -1, -1], #5 input 'e' or 'E' 14 [-1, -1, -1, 7, -1, -1], #6 after 'e' input sign 15 [-1, 8, -1, 7, -1, -1], #7 after 'e' input digits 16 [-1, 8, -1, -1, -1, -1]] #8 after valid input input space 17 state=0; i=0 18 while i<len(s): 19 inputtype = INVALID 20 if s[i]==' ': inputtype=SPACE 21 elif s[i]=='-' or s[i]=='+': inputtype=SIGN 22 elif s[i] in '0123456789': inputtype=DIGIT 23 elif s[i]=='.': inputtype=DOT 24 elif s[i]=='e' or s[i]=='E': inputtype=EXPONENT 25 26 state=transitionTable[state][inputtype] 27 if state==-1: return False 28 else: i+=1 29 return state == 1 or state == 4 or state == 7 or state == 8
Codes in Java:
1 public class Solution { 2 public boolean isNumber(String s) { 3 int[][] transitionTable={{-1, 0, 3, 1, 2, -1}, //0 no input or just spaces 4 {-1, 8, -1, 1, 4, 5}, //1 input is digits 5 {-1, -1, -1, 4, -1, -1}, //2 no digits in front just Dot 6 {-1, -1, -1, 1, 2, -1}, //3 sign 7 {-1, 8, -1, 4, -1, 5}, //4 digits and dot in front 8 {-1, -1, 6, 7, -1, -1}, //5 input 'e' or 'E' 9 {-1, -1, -1, 7, -1, -1}, //6 after 'e' input sign 10 {-1, 8, -1, 7, -1, -1}, //7 after 'e' input digits 11 {-1, 8, -1, -1, -1, -1}}; //8 after valid input input space 12 13 int state = 0; 14 for(int i = 0; i < s.length(); i ++){ 15 int input = 0;//0 invalid character 16 char c = s.charAt(i); 17 if(c == ' ') input = 1; //1 space 18 else if(c == '-' || c =='+') input = 2; //2 sign 19 else if(c >= '0' && c <= '9') input = 3; //3 digit 20 else if(c == '.') input = 4;//4 dot 21 else if(c == 'e' || c == 'E' ) input = 5;//5 exponent 22 23 state = transitionTable[state][input]; 24 25 if(state == -1) return false; 26 } 27 28 return state == 1 || state == 4 || state == 7 || state == 8; 29 } 30 }
posted on 2013-10-02 07:19 Step-BY-Step 阅读(281) 评论(0) 编辑 收藏 举报