Keshawn_lu's Blog

Leetcode 816. 模糊坐标

字数统计: 724阅读时长: 3 min
2022/11/07 Share

题目简介:

我们有一些二维坐标,如 "(1, 3)""(2, 0.5)",然后我们移除所有逗号,小数点和空格,得到一个字符串S。返回所有可能的原始字符串到一个列表中。

原始的坐标表示法不会存在多余的零,所以不会出现类似于”00”, “0.0”, “0.00”, “1.0”, “001”, “00.01”或一些其他更小的数来表示坐标。此外,一个小数点前至少存在一个数,所以也不会出现”.1”形式的数字。

最后返回的列表可以是任意顺序的。而且注意返回的两个数字中间(逗号之后)都有一个空格。

示例 1:

1
2
输入: "(123)"
输出: ["(1, 23)", "(12, 3)", "(1.2, 3)", "(1, 2.3)"]

示例 2:

1
2
3
4
输入: "(00011)"
输出: ["(0.001, 1)", "(0, 0.011)"]
解释:
0.0, 00, 0001 或 00.01 是不被允许的。

示例 3:

1
2
3
4
输入: "(100)"
输出: [(10, 0)]
解释:
1.0 是不被允许的。

提示:

  • 4 <= S.length <= 12.
  • S[0] = “(“, S[S.length - 1] = “)”, 且字符串 S 中的其他元素都是数字。

思路:

首先将字符串去除两端的括号。

然后依次遍历可以切割成两个字符串的位置,以下几种情况不能进行下一步操作:

  • 字符串的大小大于1,且只有0
  • 字符串的首个字符和最后一个字符都为0,如0.10

然后每个字符串进行所有可能情况的遍历,即遍历小数点添加的位置

若小数点的后半部分的最后一个字符为0,则舍去,如1.0

最后将切割完的两个字符串的所有情况依次添加到结果数组中即可。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
class Solution {
public:

vector<string> res;

vector<string> solve2(string& s){

if(s.size() == 1)
return {s};

vector<string> temp;
string now_s;


int i = 0;
if(s[i] == '0'){

now_s = "0.";
i++;

while(i < s.size()){

now_s += s[i];
i++;
}

return {now_s};
}

temp.push_back(s);
for(int i = 0; i < s.size() - 1; i++){ //寻找切割点

string first = s.substr(0, i + 1);
string second = s.substr(i + 1, s.size() - i);

if(second[second.size() - 1] != '0')
temp.push_back(first + "." + second);
}

return temp;

}

bool judge(string& s){

if(s.size() == 1)
return true;

int i = 0;
while(i < s.size() && s[i] == '0')
i++;

return !(i == s.size() || (s[s.size() - 1] == '0' && s[0] == '0'));
}

void solve(int pos, string& s){

string s1 = s.substr(0, pos + 1);
string s2 = s.substr(pos + 1, s.size() - pos);

if(!judge(s1) || !judge(s2))
return;

vector<string> v_1 = solve2(s1);
vector<string> v_2 = solve2(s2);

for(int i = 0; i < v_1.size(); i++){

for(int j = 0; j < v_2.size(); j++){

res.push_back("(" + v_1[i] + ", " + v_2[j] + ")");
}
}
}

vector<string> ambiguousCoordinates(string s) {

s = s.substr(1, s.size() - 2);

for(int i = 0; i < s.size() - 1; i++){

solve(i, s);
}

return res;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: