1. 问题描述:
我们有一些二维坐标,如 "(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 中的其他元素都是数字。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ambiguous-coordinates
2. 思路分析:
① 一开始的时候想到使用for循环进行组合,对于字符串中没有0的情况那么使用两层for循环就可以解决了,但是假如存在0的情况的话就比较麻烦,因为可能存在前导0与后导0,所以细节处理起来会有点麻烦
② 在领扣的评论区中学习到了一种新的解决的方法,使用itertools.product来表示笛卡尔积,因为使用的是python3语言,所以可以使用python中的itertools.product来表示笛卡尔积的组合过程,product方法中的参数为可迭代的对象,并且使用这个迭代的方法有一个好处是迭代的对象有一个为空集的时候不会进行迭代了,这个是非常适用于出现前导0的情况,比如00与000等等我们判断出这种情况返回空集就不会迭代了,实际上这个笛卡尔积本质上的两个for循环的嵌套使用,python中对于这个方法的详解如下:
https://docs.python.org/zh-cn/3.8/library/itertools.html#itertools.product
③ 刚开始学习python语言的时候做题看别人的代码感觉可以学到比较多新的api,在列表的操作中比较常见的是迭代与切片操作,这样对python的基础的用法会熟悉一点
3. 代码如下:
class Solution:
def ambiguousCoordinates(self, S):
S = S[1:-1]
res = []
# 加小数点
def f(S):
if not S or (len(S) > 1 and S[0] == "0" and S[-1] == "0"):
# 返回空列表的时候product方法不会迭代
return []
if S == "0":
return [S[0]]
if S[0] == "0" and len(S) > 1:
return [S[0]+ "." + S[1:]]
if S[-1] =="0" and len(S) > 1:
return [S]
# 多个集合的并操作
return [S] + [S[:i] + "." + S[i:] for i in range(1, len(S))]
# 拆数字
for i in range(1,len(S)):
# itertools.product:笛卡尔积的组合过程
for x,y in itertools.product(f(S[:i]), f(S[i:])):
# 列表的添加元素操作
res.append("(%s, %s)"%(x,y))
return res