Skip to content

Commit f242eff

Browse files
committedOct 12, 2022
feat: add solutions to lc problem: No.0816
No.0816.Ambiguous Coordinates
1 parent 9195406 commit f242eff

File tree

6 files changed

+241
-71
lines changed

6 files changed

+241
-71
lines changed
 

Diff for: ‎solution/0800-0899/0816.Ambiguous Coordinates/README.md

+88-28
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,16 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60-
暴力模拟
60+
**方法一:暴力模拟**
6161

62-
把 s 按照不同长度去做 x, y 两部分的拆分
62+
枚举纵坐标的起始位置,然后分别获取横、纵坐标的所有可能的表示形式,最后将横、纵坐标的所有可能的表示形式组合起来
6363

64-
将拆分后的 x, y,分别检查是否满足以下条件
64+
我们将一个坐标值 $x$ 或 $y$ 按照小数点的位置分成左右两部分,那么两部分应该满足以下条件
6565

66-
- 左半部分开头不能是 0(除非是 0 本身)
67-
- 右半部分不能以 0 为结尾
66+
1. 左半部分不能以 0 开头,除非左半部分只有 0;
67+
2. 右半部分不能以 0 结尾。
68+
69+
时间复杂度 $O(n^3)$,其中 $n$ 为字符串 $S$ 的长度。
6870

6971
<!-- tabs:start -->
7072

@@ -75,24 +77,19 @@
7577
```python
7678
class Solution:
7779
def ambiguousCoordinates(self, s: str) -> List[str]:
78-
def convert(i, j):
80+
def f(i, j):
7981
res = []
8082
for k in range(1, j - i + 1):
81-
left, right = s[i : i + k], s[i + k : j]
82-
valid = (
83-
left == '0' or not left.startswith('0')
84-
) and not right.endswith('0')
85-
if valid:
86-
res.append(left + ('.' if k < j - i else '') + right)
83+
l, r = s[i : i + k], s[i + k : j]
84+
ok = (l == '0' or not l.startswith('0')) and not r.endswith('0')
85+
if ok:
86+
res.append(l + ('.' if k < j - i else '') + r)
8787
return res
8888

8989
n = len(s)
90-
ans = []
91-
for i in range(2, n - 1):
92-
for x in convert(1, i):
93-
for y in convert(i, n - 1):
94-
ans.append(f'({x}, {y})')
95-
return ans
90+
return [
91+
f'({x}, {y})' for i in range(2, n - 1) for x in f(1, i) for y in f(i, n - 1)
92+
]
9693
```
9794

9895
### **Java**
@@ -105,32 +102,95 @@ class Solution {
105102
int n = s.length();
106103
List<String> ans = new ArrayList<>();
107104
for (int i = 2; i < n - 1; ++i) {
108-
for (String x : convert(s, 1, i)) {
109-
for (String y : convert(s, i, n - 1)) {
105+
for (String x : f(s, 1, i)) {
106+
for (String y : f(s, i, n - 1)) {
110107
ans.add(String.format("(%s, %s)", x, y));
111108
}
112109
}
113110
}
114111
return ans;
115112
}
116113

117-
private List<String> convert(String s, int i, int j) {
114+
private List<String> f(String s, int i, int j) {
118115
List<String> res = new ArrayList<>();
119116
for (int k = 1; k <= j - i; ++k) {
120-
String left = s.substring(i, i + k);
121-
String right = s.substring(i + k, j);
122-
// 左半部分开头不能是0(除非是0本身)
123-
// 右半部分不能以0为结尾
124-
boolean valid = ("0".equals(left) || !left.startsWith("0")) && !right.endsWith("0");
125-
if (valid) {
126-
res.add(left + (k < j - i ? "." : "") + right);
117+
String l = s.substring(i, i + k);
118+
String r = s.substring(i + k, j);
119+
boolean ok = ("0".equals(l) || !l.startsWith("0")) && !r.endsWith("0");
120+
if (ok) {
121+
res.add(l + (k < j - i ? "." : "") + r);
127122
}
128123
}
129124
return res;
130125
}
131126
}
132127
```
133128

129+
### **C++**
130+
131+
```cpp
132+
class Solution {
133+
public:
134+
vector<string> ambiguousCoordinates(string s) {
135+
int n = s.size();
136+
vector<string> ans;
137+
auto f = [&](int i, int j) {
138+
vector<string> res;
139+
for (int k = 1; k <= j - i; ++k) {
140+
string l = s.substr(i, k);
141+
string r = s.substr(i + k, j - i - k);
142+
bool ok = (l == "0" || l[0] != '0') && r.back() != '0';
143+
if (ok) {
144+
res.push_back(l + (k < j - i ? "." : "") + r);
145+
}
146+
}
147+
return res;
148+
};
149+
for (int i = 2; i < n - 1; ++i) {
150+
for (auto& x : f(1, i)) {
151+
for (auto& y : f(i, n - 1)) {
152+
ans.emplace_back("(" + x + ", " + y + ")");
153+
}
154+
}
155+
}
156+
return ans;
157+
}
158+
};
159+
```
160+
161+
### **Go**
162+
163+
```go
164+
func ambiguousCoordinates(s string) []string {
165+
f := func(i, j int) []string {
166+
res := []string{}
167+
for k := 1; k <= j-i; k++ {
168+
l, r := s[i:i+k], s[i+k:j]
169+
ok := (l == "0" || l[0] != '0') && (r == "" || r[len(r)-1] != '0')
170+
if ok {
171+
t := ""
172+
if k < j-i {
173+
t = "."
174+
}
175+
res = append(res, l+t+r)
176+
}
177+
}
178+
return res
179+
}
180+
181+
n := len(s)
182+
ans := []string{}
183+
for i := 2; i < n-1; i++ {
184+
for _, x := range f(1, i) {
185+
for _, y := range f(i, n-1) {
186+
ans = append(ans, "("+x+", "+y+")")
187+
}
188+
}
189+
}
190+
return ans
191+
}
192+
```
193+
134194
### **...**
135195

136196
```

Diff for: ‎solution/0800-0899/0816.Ambiguous Coordinates/README_EN.md

+81-21
Original file line numberDiff line numberDiff line change
@@ -57,24 +57,19 @@
5757
```python
5858
class Solution:
5959
def ambiguousCoordinates(self, s: str) -> List[str]:
60-
def convert(i, j):
60+
def f(i, j):
6161
res = []
6262
for k in range(1, j - i + 1):
63-
left, right = s[i : i + k], s[i + k : j]
64-
valid = (
65-
left == '0' or not left.startswith('0')
66-
) and not right.endswith('0')
67-
if valid:
68-
res.append(left + ('.' if k < j - i else '') + right)
63+
l, r = s[i : i + k], s[i + k : j]
64+
ok = (l == '0' or not l.startswith('0')) and not r.endswith('0')
65+
if ok:
66+
res.append(l + ('.' if k < j - i else '') + r)
6967
return res
7068

7169
n = len(s)
72-
ans = []
73-
for i in range(2, n - 1):
74-
for x in convert(1, i):
75-
for y in convert(i, n - 1):
76-
ans.append(f'({x}, {y})')
77-
return ans
70+
return [
71+
f'({x}, {y})' for i in range(2, n - 1) for x in f(1, i) for y in f(i, n - 1)
72+
]
7873
```
7974

8075
### **Java**
@@ -85,30 +80,95 @@ class Solution {
8580
int n = s.length();
8681
List<String> ans = new ArrayList<>();
8782
for (int i = 2; i < n - 1; ++i) {
88-
for (String x : convert(s, 1, i)) {
89-
for (String y : convert(s, i, n - 1)) {
83+
for (String x : f(s, 1, i)) {
84+
for (String y : f(s, i, n - 1)) {
9085
ans.add(String.format("(%s, %s)", x, y));
9186
}
9287
}
9388
}
9489
return ans;
9590
}
9691

97-
private List<String> convert(String s, int i, int j) {
92+
private List<String> f(String s, int i, int j) {
9893
List<String> res = new ArrayList<>();
9994
for (int k = 1; k <= j - i; ++k) {
100-
String left = s.substring(i, i + k);
101-
String right = s.substring(i + k, j);
102-
boolean valid = ("0".equals(left) || !left.startsWith("0")) && !right.endsWith("0");
103-
if (valid) {
104-
res.add(left + (k < j - i ? "." : "") + right);
95+
String l = s.substring(i, i + k);
96+
String r = s.substring(i + k, j);
97+
boolean ok = ("0".equals(l) || !l.startsWith("0")) && !r.endsWith("0");
98+
if (ok) {
99+
res.add(l + (k < j - i ? "." : "") + r);
105100
}
106101
}
107102
return res;
108103
}
109104
}
110105
```
111106

107+
### **C++**
108+
109+
```cpp
110+
class Solution {
111+
public:
112+
vector<string> ambiguousCoordinates(string s) {
113+
int n = s.size();
114+
vector<string> ans;
115+
auto f = [&](int i, int j) {
116+
vector<string> res;
117+
for (int k = 1; k <= j - i; ++k) {
118+
string l = s.substr(i, k);
119+
string r = s.substr(i + k, j - i - k);
120+
bool ok = (l == "0" || l[0] != '0') && r.back() != '0';
121+
if (ok) {
122+
res.push_back(l + (k < j - i ? "." : "") + r);
123+
}
124+
}
125+
return res;
126+
};
127+
for (int i = 2; i < n - 1; ++i) {
128+
for (auto& x : f(1, i)) {
129+
for (auto& y : f(i, n - 1)) {
130+
ans.emplace_back("(" + x + ", " + y + ")");
131+
}
132+
}
133+
}
134+
return ans;
135+
}
136+
};
137+
```
138+
139+
### **Go**
140+
141+
```go
142+
func ambiguousCoordinates(s string) []string {
143+
f := func(i, j int) []string {
144+
res := []string{}
145+
for k := 1; k <= j-i; k++ {
146+
l, r := s[i:i+k], s[i+k:j]
147+
ok := (l == "0" || l[0] != '0') && (r == "" || r[len(r)-1] != '0')
148+
if ok {
149+
t := ""
150+
if k < j-i {
151+
t = "."
152+
}
153+
res = append(res, l+t+r)
154+
}
155+
}
156+
return res
157+
}
158+
159+
n := len(s)
160+
ans := []string{}
161+
for i := 2; i < n-1; i++ {
162+
for _, x := range f(1, i) {
163+
for _, y := range f(i, n-1) {
164+
ans = append(ans, "("+x+", "+y+")")
165+
}
166+
}
167+
}
168+
return ans
169+
}
170+
```
171+
112172
### **...**
113173

114174
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
vector<string> ambiguousCoordinates(string s) {
4+
int n = s.size();
5+
vector<string> ans;
6+
auto f = [&](int i, int j) {
7+
vector<string> res;
8+
for (int k = 1; k <= j - i; ++k) {
9+
string l = s.substr(i, k);
10+
string r = s.substr(i + k, j - i - k);
11+
bool ok = (l == "0" || l[0] != '0') && r.back() != '0';
12+
if (ok) {
13+
res.push_back(l + (k < j - i ? "." : "") + r);
14+
}
15+
}
16+
return res;
17+
};
18+
for (int i = 2; i < n - 1; ++i) {
19+
for (auto& x : f(1, i)) {
20+
for (auto& y : f(i, n - 1)) {
21+
ans.emplace_back("(" + x + ", " + y + ")");
22+
}
23+
}
24+
}
25+
return ans;
26+
}
27+
};
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func ambiguousCoordinates(s string) []string {
2+
f := func(i, j int) []string {
3+
res := []string{}
4+
for k := 1; k <= j-i; k++ {
5+
l, r := s[i:i+k], s[i+k:j]
6+
ok := (l == "0" || l[0] != '0') && (r == "" || r[len(r)-1] != '0')
7+
if ok {
8+
t := ""
9+
if k < j-i {
10+
t = "."
11+
}
12+
res = append(res, l+t+r)
13+
}
14+
}
15+
return res
16+
}
17+
18+
n := len(s)
19+
ans := []string{}
20+
for i := 2; i < n-1; i++ {
21+
for _, x := range f(1, i) {
22+
for _, y := range f(i, n-1) {
23+
ans = append(ans, "("+x+", "+y+")")
24+
}
25+
}
26+
}
27+
return ans
28+
}

Diff for: ‎solution/0800-0899/0816.Ambiguous Coordinates/Solution.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@ public List<String> ambiguousCoordinates(String s) {
33
int n = s.length();
44
List<String> ans = new ArrayList<>();
55
for (int i = 2; i < n - 1; ++i) {
6-
for (String x : convert(s, 1, i)) {
7-
for (String y : convert(s, i, n - 1)) {
6+
for (String x : f(s, 1, i)) {
7+
for (String y : f(s, i, n - 1)) {
88
ans.add(String.format("(%s, %s)", x, y));
99
}
1010
}
1111
}
1212
return ans;
1313
}
1414

15-
private List<String> convert(String s, int i, int j) {
15+
private List<String> f(String s, int i, int j) {
1616
List<String> res = new ArrayList<>();
1717
for (int k = 1; k <= j - i; ++k) {
18-
String left = s.substring(i, i + k);
19-
String right = s.substring(i + k, j);
20-
boolean valid = ("0".equals(left) || !left.startsWith("0")) && !right.endsWith("0");
21-
if (valid) {
22-
res.add(left + (k < j - i ? "." : "") + right);
18+
String l = s.substring(i, i + k);
19+
String r = s.substring(i + k, j);
20+
boolean ok = ("0".equals(l) || !l.startsWith("0")) && !r.endsWith("0");
21+
if (ok) {
22+
res.add(l + (k < j - i ? "." : "") + r);
2323
}
2424
}
2525
return res;
2626
}
27-
}
27+
}

0 commit comments

Comments
 (0)