Validate if a given string is numeric.
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
Use DFA(Deterministic Finite Automata)
Code from http://jelices.blogspot.com/2013/12/leetcode-valid-number.html
We accept the following regular grammar, shown as UNIX regular expression by simplicity:
\s*[\+\-]?(([0-9]+(\.[0-9]*)?)|\.[0-9]+)([eE][+-]?[0-9]+)?\s*
where \s represents [ \t].
This regular expression is accepted by the underneath DFA(Deterministic Finite Automata):
Code from http://www.cnblogs.com/midnightcat/p/3364431.html
Read full article from LeetCode - Valid Number | Darren's Blog
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
public boolean isNumber(String s) {
s = s.trim(); // Get rid of leading and trailing whitespaces
int n = s.length();
if (n == 0)
return false;
boolean isFractional = false; // Indicate appearance of '.'
boolean isExponential = false; // Indicate appearance of 'e/E'
boolean valid = false; // Indicate whether preceding digits are valid
boolean expoBefore = false; // Indicate whether the preceding digit is 'e/E'
boolean validFrac = true; // Indicate whether the number is a vaild fraction (true by default)
boolean validExpo = true; // Indicate whether the number is a valid exponential (true by default)
int i = 0;
if (s.charAt(0) == '+' || s.charAt(0) == '-') // Consider sign
i = 1;
// Process each digit in sequence
for (; i < n; i++) {
char c = s.charAt(i);
if (c == '+' || c == '-') { // +/- is valid only after e/E
if (!expoBefore)
return false;
expoBefore = false;
valid = false;
} else if (c == 'e' || c == 'E') { // Only one e/E is valid; preceding digits should be valid
if (isExponential || !valid)
return false;
isExponential = true;
valid = false;
expoBefore = true;
validExpo = false;
} else if (c == '.') { // Only one '.' is valid; cannot appear as an exponential
if (isFractional || isExponential)
return false;
isFractional = true;
if (!valid) // Must have fractional part
validFrac = false;
} else if (c >= '0' && c <='9') { // Regular digits
valid = true;
expoBefore = false;
validFrac = true;
validExpo = true;
} else {
return false;
}
}
// After reaching the end, make sure the number is indeed valid
if (!valid || !validFrac || !validExpo)
return false;
else
return true;
}
Use DFA(Deterministic Finite Automata)
Code from http://jelices.blogspot.com/2013/12/leetcode-valid-number.html
We accept the following regular grammar, shown as UNIX regular expression by simplicity:
\s*[\+\-]?(([0-9]+(\.[0-9]*)?)|\.[0-9]+)([eE][+-]?[0-9]+)?\s*
where \s represents [ \t].
This regular expression is accepted by the underneath DFA(Deterministic Finite Automata):
public boolean isNumber(String s) { int state = 0; for(int i=0; i<s.length();i++) { state=getNextState(state, s.charAt(i)); if (state==-1) return false; } state = getNextState(state, ' '); return state == 8; } private int getNextState(int state, char c) { int[][] transitionTable = { {0,2,1,3,-1,-1}, {-1,2,-1,3,-1,-1}, {8,2,-1,4,5,-1}, {-1,4,-1,-1,-1,-1}, {8,4,-1,-1,5,-1}, {-1,7,6,-1,-1,-1}, {-1,7,-1,-1,-1,-1}, {8,7,-1,-1,-1,-1}, {8,-1,-1,-1,-1,-1}}; return transitionTable[state][getSymbol(c)]; } private int getSymbol(char c) { switch(c) { case ' ': case '\t': return 0; case '0': case '1': case '2':case '3': case '4': case '5': case '6': case '7': case '8': case '9': return 1; case '+': case '-': return 2; case '.': return 3; case 'E': case 'e': return 4; default: return 5; } }Use Regular Expression:
Code from http://www.cnblogs.com/midnightcat/p/3364431.html
Pattern p = Pattern.compile("^[\\+\\-]?((\\d+(\\.\\d*)?)|(\\.\\d+))(e[\\+\\-]?\\d+)?$"); public boolean isNumber(String s) { String ss = s.trim(); return p.matcher(ss).matches(); }Also refer to http://blog.csdn.net/ithomer/article/details/8832300
Read full article from LeetCode - Valid Number | Darren's Blog
No comments:
Post a Comment