使用C++编程 合法数字组成部分(按顺序): 1)一个 小数 或者 整数 2)(可选)一个 'e' 或 'E' ,后面跟着一个 整数 其中: 小数组成部分(按顺序): 1)(可选)一个符号字符('+' 或 '-') 2)下述格式之一: 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字 一个点 '.' ,后面跟着至少一位数字 整数组成部分(按顺序): 1)(可选)一个符号字符('+' 或 '-') 2) 至少一位数字 部分合法数字列举如下:["2", "0089", "-0.1", "+3.14", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"] 部分不合法数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53", "4."] 给你一个字符串 s ,如果 s 是一个 合法数字 ,请返回 true 。
时间: 2023-07-02 19:09:25 浏览: 78
c++基础知识 都来看看
可以使用有限状态自动机(DFA)来解决这个问题。首先,我们需要定义数字的可能状态,以及在每个状态下接受哪些字符。这将有助于我们构建 DFA 的状态转移表。
考虑以下状态:
1. 初始状态
2. 符号位
3. 整数部分
4. 左侧有整数的小数点
5. 左侧没有整数的小数点
6. 小数部分
7. 字符 e
8. 指数符号
9. 指数整数部分
10. 结束状态
接下来,我们可以定义状态转移表:
| | ' ' | '+' | '-' | '.' | '0'-'9' | 'e' | other |
|----|-----|-----|-----|-----|---------|-----|-------|
| 1 | 1 | 2 | 2 | 5 | 3 | -1 | -1 |
| 2 | -1 | -1 | -1 | 5 | 3 | -1 | -1 |
| 3 | 10 | -1 | -1 | 4 | 3 | 7 | -1 |
| 4 | 10 | -1 | -1 | -1 | 6 | 7 | -1 |
| 5 | -1 | -1 | -1 | 5 | 6 | -1 | -1 |
| 6 | 10 | -1 | -1 | -1 | 6 | 7 | -1 |
| 7 | -1 | 8 | 8 | -1 | 9 | -1 | -1 |
| 8 | -1 | -1 | -1 | -1 | 9 | -1 | -1 |
| 9 | 10 | -1 | -1 | -1 | 9 | -1 | -1 |
| 10 | 10 | -1 | -1 | -1 | -1 | -1 | -1 |
表中的每个条目都是一个状态,该状态表示 DFA 的当前状态。行是先前的状态,列是接受的字符。如果在给定状态下接受了字符,则转移到新状态;否则,它将保持在当前状态。-1 表示无效的状态转换。
最后,我们可以使用 DFA 的状态转移表来实现代码:
```c++
class Solution {
public:
bool isNumber(string s) {
int state = 1;
for (char c : s) {
int input = getInputType(c);
if (transitionTable[state][input] == -1) {
return false;
}
state = transitionTable[state][input];
}
return state == 3 || state == 4 || state == 6 || state == 9 || state == 10;
}
private:
vector<vector<int>> transitionTable = {
{1, 2, 2, 5, 3, -1, -1},
{-1, -1, -1, 5, 3, -1, -1},
{10, -1, -1, 4, 3, 7, -1},
{10, -1, -1, -1, 6, 7, -1},
{-1, -1, -1, 5, 6, -1, -1},
{10, -1, -1, -1, 6, 7, -1},
{-1, 8, 8, -1, 9, -1, -1},
{-1, -1, -1, -1, 9, -1, -1},
{10, -1, -1, -1, 9, -1, -1},
{10, -1, -1, -1, -1, -1, -1}
};
int getInputType(char c) {
if (isspace(c)) {
return 0;
} else if (c == '+' || c == '-') {
return 1;
} else if (c == '.') {
return 3;
} else if (c == 'e' || c == 'E') {
return 5;
} else if (isdigit(c)) {
return 4;
} else {
return 6;
}
}
};
```
这里我们使用一个状态变量,表示 DFA 的当前状态。我们迭代字符串中的每个字符,并使用 `getInputType` 函数将其转换为输入类型。然后,我们在状态转移表中查找下一个状态,并将状态变量更新为该值。最后,我们检查我们是否在一个有效的结束状态中。如果是这样,我们返回 true;否则,我们返回 false。
这种方法的时间复杂度为 O(n),其中 n 是输入字符串的长度,因为我们在迭代字符串中的每个字符。空间复杂度为 O(1),因为我们只使用一些常量和一个状态变量。
阅读全文