题目
我们有一些二维坐标,如 "(1, 3)"
或 "(2, 0.5)"
,然后我们移除所有逗号,小数点和空格,得到一个字符串S
。返回所有可能的原始字符串到一个列表中。
原始的坐标表示法不会存在多余的零,所以不会出现类似于"00", “0.0”, “0.00”, “1.0”, “001”, "00.01"或一些其他更小的数来表示坐标。此外,一个小数点前至少存在一个数,所以也不会出现“.1”形式的数字。
最后返回的列表可以是任意顺序的。而且注意返回的两个数字中间(逗号之后)都有一个空格。
示例 1:
输入: "(123)"
输出: ["(1, 23)", "(12, 3)", "(1.2, 3)", "(1, 2.3)"]
示例 2:
输入: "(00011)"
输出: ["(0.001, 1)", "(0, 0.011)"]
解释:
0.0, 00, 0001 或 00.01 是不被允许的。
示例 3:
输入: "(0123)"
输出: ["(0, 123)", "(0, 12.3)", "(0, 1.23)", "(0.1, 23)", "(0.1, 2.3)", "(0.12, 3)"]
示例 4:
输入: "(100)"
输出: [(10, 0)]
解释:
1.0 是不被允许的。
提示:
4 <= S.length <= 12
.S[0]
= “(”,S[S.length - 1]
= “)”, 且字符串S
中的其他元素都是数字。
解题
方法一:枚举
思路
首先把输入字符串头尾的括号去掉(设去掉后的字符串长度为 n
),然后枚举 ','
的位置(从 枚举 i
表示在 i
之后插入 ','
)把字符串分为两部分,并分别处理得到一个可能的集合:
- 没有小数点时,字符串长度大于 时没有前导零的字符串算作一种可能,有小数点时,枚举小数点的位置:
- 整数部分的长度大于 时,整数部分不能有前导零。
- 小数部分始终不能有后缀零。
- 把所有可能形成的数放入一个集合并返回。
最后求左右两部分集合的笛卡尔积,合并为坐标后加入答案集合。
代码
class Solution {
public List<String> ambiguousCoordinates(String s) {
s = s.substring(1, s.length() - 1);
List<String> ans = new ArrayList<>();
for (int i = 0; i < s.length() - 1; ++i) {
List<String> left = doEnum(s.substring(0, i + 1));
List<String> right = doEnum(s.substring(i + 1));
for (String l : left) {
for (String r : right) ans.add('(' + l + ", " + r + ')');
}
}
return ans;
}
List<String> doEnum(String s) {
List<String> poss = new ArrayList<>();
if (s.length() == 1 || s.charAt(0) != '0') poss.add(s);
for (int i = 0; i < s.length() - 1; ++i) {
String left = s.substring(0, i + 1), right = s.substring(i + 1);
if (left.length() > 1 && left.charAt(0) == '0' ||
right.charAt(right.length() - 1) == '0') continue;
poss.add(left + '.' + right);
}
return poss;
}
}
评论区