816. 模糊坐标

我们有一些二维坐标,如 ​​"(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​​ 中的其他元素都是数字。

Solution

今天大概算一道模拟枚举题吧。首先想到的就是将数组分成两个部分,作为添加逗号的位置。之后需要考虑添加小数点的位置,当然首先,如果合法的话,可以不添加小数点,只要没有前导0.判断是否有前导0,只需要看分成的这两部分是否第一位是0即可。当然这里又需要考虑一种特殊情况就是整个这一部分就是0,这也是合法的。

对于插小数点的位置,其实也很简单,只需要考虑分成的这个部分的第一位和最后一位,都不能是0(当然有特殊情况,即0.1这种,单独拿出来讨论即可)。

然后考虑变量的范围有点绕,写的时候需要稍微注意一下。官方题解写得好一些,首先拿掉两边的括号,其次使用函数把两个部分的枚举做了封装。这里贴我自己的Python代码:

代码(Python)

class Solution:
def ambiguousCoordinates(self, s: str) -> List[str]:
res = []
for i in range(2, len(s)-1):
part1 = []
part2 = []
if s[1]!='0' or i==2: part1.append(s[:i])
if s[i]!='0' or i==len(s)-2: part2.append(s[i:])
# 插小数点
for j in range(1, i-1):
if s[i-1]=='0': break
if j==1:
tmp = s[:2]
tmp += '.'
tmp += s[2:i]
part1.append(tmp)
else:
if s[1]=='0': break
tmp = s[:j+1]
tmp += '.'
tmp += s[j+1:i]
part1.append(tmp)
for k in range(i, len(s)-2):
if s[-2]=='0': break
if k==i:
tmp = s[k]
tmp += '.'
tmp += s[k+1:]
part2.append(tmp)
else:
if s[i]=='0': break
tmp = s[i:k+1]
tmp += '.'
tmp += s[k+1:]
part2.append(tmp)
if part1 and part2:
res += [i+', '+j for i in part1 for j in part2]
return res