Skip to content

Commit cc69cbc

Browse files
committed
二刷93
1 parent 9bc4cd0 commit cc69cbc

File tree

4 files changed

+109
-20
lines changed

4 files changed

+109
-20
lines changed

docs/0093-restore-ip-addresses.adoc

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,72 @@
11
[#0093-restore-ip-addresses]
2-
= 93. Restore IP Addresses
2+
= 93. 复原 IP 地址
33

4-
{leetcode}/problems/restore-ip-addresses/[LeetCode - Restore IP Addresses^]
4+
https://leetcode.cn/problems/restore-ip-addresses/[LeetCode - 93. 复原 IP 地址 ^]
55

6-
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
6+
*有效 IP 地址* 正好由四个整数(每个整数位于 `0``255` 之间组成,且不能含有前导 `0`),整数之间用 `'.'` 分隔。
77

8-
.Example:
9-
----
10-
Input: "25525511135"
11-
Output: ["255.255.11.135", "255.255.111.35"]
12-
----
8+
* 例如:`0.1.2.201``192.168.1.1`*有效* IP 地址,但是 `0.011.255.245``192.168.1.312``[email protected]`*无效* IP 地址。
139
14-
== 解题分析
10+
给定一个只包含数字的字符串 `s` ,用以表示一个 IP 地址,返回所有可能的**有效 IP 地址**,这些地址可以通过在 `s` 中插入 `'.'` 来形成。你 *不能* 重新排序或删除 `s` 中的任何数字。你可以按 *任何* 顺序返回答案。
1511

16-
使用回溯,每次做一次字符串切割,如果切割的字符串符合 IP 的大小值,则前进一步,直到把字符串切割完毕并且正好切割四份。
12+
*示例 1:*
1713

18-
image::images/0093-1.png[{image_attr}]
14+
....
15+
输入:s = "25525511135"
16+
输出:["255.255.11.135","255.255.111.35"]
17+
....
1918

20-
== 参考资料
19+
*示例 2:*
2120

22-
. https://leetcode-cn.com/problems/restore-ip-addresses/solution/fu-yuan-ipdi-zhi-by-leetcode/[复原IP地址 - 复原IP地址 - 力扣(LeetCode)^]
21+
....
22+
输入:s = "0000"
23+
输出:["0.0.0.0"]
24+
....
2325

24-
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
26+
*示例 3:*
2527

26-
*Example:*
28+
....
29+
输入:s = "101023"
30+
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
31+
....
2732

28-
[subs="verbatim,quotes,macros"]
29-
----
30-
*Input:* "25525511135"
31-
*Output:* `["255.255.11.135", "255.255.111.35"]`
32-
----
3333

34+
*提示:*
35+
36+
* `+1 <= s.length <= 20+`
37+
* `s` 仅由数字组成
38+
39+
== 思路分析
40+
41+
使用回溯,每次做一次字符串切割,如果切割的字符串符合 IP 的大小值,则前进一步,直到把字符串切割完毕并且正好切割四份。
42+
43+
image::images/0093-1.png[{image_attr}]
3444

3545
[[src-0093]]
46+
[tabs]
47+
====
48+
一刷::
49+
+
50+
--
3651
[{java_src_attr}]
3752
----
3853
include::{sourcedir}/_0093_RestoreIPAddresses.java[tag=answer]
3954
----
55+
--
56+
57+
二刷::
58+
+
59+
--
60+
[{java_src_attr}]
61+
----
62+
include::{sourcedir}/_0093_RestoreIpAddresses_2.java[tag=answer]
63+
----
64+
--
65+
====
66+
67+
68+
== 参考资料
69+
70+
. https://leetcode-cn.com/problems/restore-ip-addresses/solution/fu-yuan-ipdi-zhi-by-leetcode/[复原IP地址 - 复原IP地址 - 力扣(LeetCode)^]
71+
4072

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,11 @@ endif::[]
260260
|{doc_base_url}/0019-remove-nth-node-from-end-of-list.adoc[题解]
261261
|✅ 双指针+虚拟头节点。使用虚拟头结点会省事好多。
262262

263+
|{counter:codes2503}
264+
|{leetcode_base_url}/restore-ip-addresses/[93. 复原 IP 地址^]
265+
|{doc_base_url}/0093-restore-ip-addresses.adoc[题解]
266+
|✅ 回溯
267+
263268
|===
264269
˚
265270
截止目前,本轮练习一共完成 {codes2503} 道题。

src/main/java/com/diguage/algo/leetcode/_0093_RestoreIPAddresses.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ public class _0093_RestoreIPAddresses {
1818
/**
1919
* Runtime: 2 ms, faster than 88.51% of Java online submissions for Restore IP Addresses.
2020
* Memory Usage: 38.4 MB, less than 30.23% of Java online submissions for Restore IP Addresses.
21+
*
22+
* @author D瓜哥 · https://www.diguage.com
23+
* @since 2020-02-06 10:00
2124
*/
2225
public List<String> restoreIpAddresses(String s) {
2326
List<String> result = new ArrayList<>();
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class _0093_RestoreIpAddresses_2 {
7+
// tag::answer[]
8+
9+
/**
10+
* @author D瓜哥 · https://www.diguage.com
11+
* @since 2020-02-06 10:00
12+
*/
13+
public List<String> restoreIpAddresses(String s) {
14+
List<String> result = new ArrayList<>();
15+
backtrack(s, result, new ArrayList<>(4), 0);
16+
return result;
17+
}
18+
19+
private void backtrack(String s, List<String> result, List<String> path, int index) {
20+
if (path.size() == 4) {
21+
if (index == s.length()) {
22+
result.add(String.join(".", path));
23+
}
24+
return;
25+
}
26+
for (int i = 1; i <= 3; i++) {
27+
int end = index + i;
28+
if (end > s.length()) {
29+
break;
30+
}
31+
String nums = s.substring(index, end);
32+
if (Integer.parseInt(nums) > 255) {
33+
break;
34+
}
35+
path.add(nums);
36+
backtrack(s, result, path, end);
37+
path.removeLast();
38+
// 如果起始字符是 0,则只处理 0 这一种情况,不允许出现 01 等情况
39+
if (s.charAt(index) == '0') {
40+
break;
41+
}
42+
}
43+
}
44+
45+
// end::answer[]
46+
public static void main(String[] args) {
47+
new _0093_RestoreIpAddresses_2().restoreIpAddresses("101023");
48+
}
49+
}

0 commit comments

Comments
 (0)