public class Solution {
public boolean isNumeric(char[] str) {
if(str==null)return false;
return match(str,false,false,0);
}
public boolean match(char[] str, boolean e, boolean point, int p){
if(p==str.length)return true;//遍历到结尾,返回true
if(p==0){//如果是第一个字符
if(isSign(str[p])||isNumber(str[p]))//如果是数字或正负符号
return match(str, e, point, p+1);
if(str[p]=='.')//如果是小数点,point标记已经出现
return match(str, e, true, p+1);
}else{
if(isNumber(str[p]))//如果是数字,往后走
return match(str, e, point, p+1);
if((point && str[p]=='.')||(e &&isE(str[p])))
return false;//如果.或者e前面已经出现,返回false
if(p<str.length-1 && isE(str[p]))//如果前面没出现e,且e后有字符
return match(str, true, point, p+1);
if(str[p]=='.'&&e==false)//如果前面没出现.,且出现在e前面继续往后走
return match(str, e, true, p+1);
if(p<str.length-1 && isE(str[p-1])&& isSign(str[p]))//正负符号只允许一种情况在非首位出现:跟在e后面,且后面仍有字符
return match(str, e, point, p+1);
}
return false;
}
public boolean isE(char c){
if(c=='e'||c=='E')
return true;
return false;
}
public boolean isNumber(char c){
if(c>='0' && c<='9')
return true;
return false;
}
public boolean isSign(char c){
if(c=='+' || c=='-')
return true;
return false;
}
}