本文共 1290 字,大约阅读时间需要 4 分钟。
实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
一个标识数字的字符串可能包括以下字符类型:
为了解决此类问题,需要使用有限状态自动机,字符串有如下状态:
合法的结束状态有:2、3、7、8。
状态转移如下图所示:
复杂度分析:
状态使用字典列表表示,具体实现为:
func isNumber(strNum string) bool { state := []map[byte]int{ { ' ':0, 's':1, 'd':2, '.':4}, // 0: start with 'blank' { 'd':2, '.':4}, // 1: 'sign' before e { 'd':2, '.':3, 'e':5, ' ':8}, // 2: 'digit' before '.' { 'd':3, 'e':5, ' ':8}, // 3: 'digit' after '.' { 'd':3}, // 4: 'digit' after '.'(‘blank’ before 'dot') { 's':6, 'd':7}, // 5: 'e' { 'd':7}, // 6: 'sign' after 'e' { 'd':7, ' ':8}, // 7: 'digit' after e { ' ':8}, // 8: end with 'blank' } index := 0 var key byte for _,ch := range strNum { if ch>='0' && ch <= '9'{ key = 'd' }else { switch ch { case '+', '-': key = 's' case 'e', 'E': key = 'e' case '.', ' ': key = byte(ch) default: key = '?' } } if _,ok:=state[index][key]; !ok{ return false } index = state[index][key] } switch index { case 2,3,7,8: return true default: return false }}
转载地址:http://ewilf.baihongyu.com/