题目链接
Leetcode.816 模糊坐标 Rating : 1708
题目描述
我们有一些二维坐标,如 "(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:
示例 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 . l e n g t h < = 12 4 <= S.length <= 12 4<=S.length<=12
S[0] = "(", S[S.length - 1] = ")"
, 且字符串 S 中的其他元素都是数字。
分析:
对于每一个 合格 的坐标,肯定会出现一次 ,
,逗号两边小数点也最多出现一次。
我们先将原来的 s = "(1234567)"
,变为 s = "1234567"
,即把括号去掉,n
是新的s
的长度。
接着我们枚举 ,
出现的位置 [1,n-2]
,共 n-1
个位置。
对于每一个位置 idx
(
1
<
=
i
d
x
<
=
n
−
2
)
(1 <= idx <= n-2)
(1<=idx<=n−2),我们将 s
分为两个子串,a = s[0,idx]
和 b = s[idx+1,n-1]
。
对于每一个子串,我们再定义一个函数 fun(int l,int r,s)
,返回 s[l,r]
中合法数字的集合。
x = fun(0,idx,s)
和 y = fun(idx+1,n-1,s)
分别是由 ,
分隔的两段子串的合法数字的集合。
最后我们再根据 乘法原理 ,将其拼起来加入到答案集合中即可。
时间复杂度: O ( n 3 ) O(n^3) O(n3)
C++代码:
class Solution {
public:
vector<string> fun(int l,int r,string &s){
vector<string> ans;
//如果只有一个数字 或者 第一个数字不是0的话 那么它本身也是一个合法数字 所以需要记录
if(l == r || s[l] != '0') ans.push_back(s.substr(l,r-l+1));
for(int i = l;i < r;i++){
//s[l,i]
auto a = s.substr(l,i-l+1);
//s[i+1,r]
auto b = s.substr(i+1,r-i);
//小数点左边不能出现 类似于 "00" "01" "012" 之类的数字
if(a.size() > 1 && a[0] == '0') continue;
//小数点右边 最后一位也不能为 0
if(b[b.size() - 1] == '0') continue;
ans.push_back(a + "." + b);
}
return ans;
}
vector<string> ambiguousCoordinates(string s) {
int n = s.size();
s = s.substr(1,n-2);
n -= 2;
vector<string> res;
for(int i = 0;i < n - 1;i++){
auto a = fun(0,i,s),b = fun(i + 1,n - 1,s);
for(auto x:a){
for(auto y:b) res.push_back("(" + x + ", " + y + ")");
}
}
return res;
}
};
Java代码:
class Solution {
private List<String> fun(int l,int r,String s){
List<String> list = new ArrayList<>();
if(l == r || s.charAt(l) != '0') list.add(s.substring(l,r+1));
for(int i = l;i < r;i++){
String a = s.substring(l,i+1);
String b = s.substring(i+1,r+1);
if(a.length() > 1 && a.charAt(0) == '0') continue;
if(b.charAt(b.length() - 1) == '0') continue;
list.add(a + "." + b);
}
return list;
}
public List<String> ambiguousCoordinates(String s) {
int n = s.length();
s = s.substring(1,n);
n -= 2;
List<String> res = new ArrayList<>();
for(int i = 0;i < n - 1;i++){
List<String> a = fun(0,i,s);
List<String> b = fun(i+1,n-1,s);
for(String x : a){
for(String y : b) res.add("(" + x + ", " + y + ")");
}
}
return res;
}
}