题目分析:[[EVD]] - 剑指 Offer 20. 表示数值的字符串
https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/
简单描述:
- 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
限制🚫
- 1 <= s.length <= 20
- s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。
示例:
输入:s = "0"
输出:true输入:s = " .1 "
输出:true
解题思路:
思路:
- #有限状态自动机DFA A = (输入表,状态集S,初始态S0,状态转移函数Q,接受态F) = A(5种符号,9个状态,初始状态0,p=status[p][输入],接受状态:2、3、7、8) **PS:也可以考虑官方题解的,独立出小数部分这个状态**
- 状态转移表
-
借用大佬图片,如有侵权请联系我删除
效率:
- 时间复杂度
- 空间复杂度
代码:
class Solution
{
public:
/*DFA*/
typedef pair<char, int> charint;
typedef unordered_map<char, int> unmap;
bool isNumber(string s)
{
vector<unmap> status = {
// 0 首次输入
unmap{charint(' ', 0), charint('s', 1), charint('d', 2), charint('.', 4)},
// 1
unmap{charint('d', 2), charint('.', 4)},
// 2
unmap{charint('d', 2), charint('.', 3), charint('e', 5), charint(' ', 8)},
// 3
unmap{charint('d', 3), charint('e', 5), charint(' ', 8)},
// 4
unmap{charint('d', 3)},
// 5
unmap{charint('d', 7), charint('s', 6)},
// 6
unmap{charint('d', 7)},
// 7
unmap{charint('d', 7), charint(' ', 8)},
// 8
unmap{charint(' ', 8)}};
int p = 0;
char t;
for (auto c : s)
{
if (c >= '0' && c <= '9')
t = 'd';
else if (c == '+' || c == '-')
t = 's';
else if (c == 'e' || c == 'E')
t = 'e';
else if (c == ' ' || c == '.')
t = c;
else
t = '?';
if (!status[p].count(t))
return false;
p = (int)status[p][t];
}
return p == 2 || p == 3 || p == 7 || p == 8;
}
};