Skip to content

Commit 9b0d49e

Browse files
committed
三刷139
1 parent 37db4b4 commit 9b0d49e

File tree

9 files changed

+67
-14
lines changed

9 files changed

+67
-14
lines changed

docs/0139-word-break.adoc

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[#0139-word-break]
22
= 139. 单词拆分
33

4-
https://leetcode.cn/problems/word-break/[LeetCode - 139. 单词拆分 ^]
4+
https://leetcode.cn/problems/word-break/[LeetCode - 139. 单词拆分^]
55

66
给你一个字符串 `s` 和一个字符串列表 `wordDict` 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 `s` 则返回 `true`
77

@@ -44,22 +44,24 @@ https://leetcode.cn/problems/word-break/[LeetCode - 139. 单词拆分 ^]
4444

4545
回溯+备忘录:
4646

47-
image::images/0139-01.png[{image_attr}]
47+
image::images/0139-10.png[{image_attr}]
4848

4949
动态规划
5050

51-
image::images/0139-02.png[{image_attr}]
51+
image::images/0139-11.png[{image_attr}]
5252

53-
image::images/0139-03.png[{image_attr}]
53+
image::images/0139-12.png[{image_attr}]
5454

55-
image::images/0139-04.png[{image_attr}]
55+
image::images/0139-13.png[{image_attr}]
5656

5757
我的思路:
5858

59-
stem:[dp\[i+j\] = dp\[i\] & s\[i, i+j\] in dict]
59+
stem:[dp[i+j\] = dp[i\] \& (s[i, i+j\] \in dict)]
6060

6161
从 stem:[0] 到 stem:[i] 已经确定。从当前位置 stem:[i] 向前推进到 stem:[i+j],其中 stem:[j] 是某个一个单词的长度。
6262

63+
动态规划。有两种思路:①向后看,从当前位置截取 `word` 长度的子串,判断子串和当前 `word` 是否相等以及之前的字符串是否可以可以拆分;②向前进,从零开始,根据当前 `word` 的长度,在同等长度子串相等的情况下,向前设置子串可以拆分,直到结尾。
64+
6365
[[src-0139]]
6466
[tabs]
6567
====
@@ -89,9 +91,20 @@ include::{sourcedir}/_0139_WordBreak_20.java[tag=answer]
8991
include::{sourcedir}/_0139_WordBreak_21.java[tag=answer]
9092
----
9193
--
94+
95+
三刷::
96+
+
97+
--
98+
[{java_src_attr}]
99+
----
100+
include::{sourcedir}/_0139_WordBreak_3.java[tag=answer]
101+
----
102+
--
92103
====
93104

94105
== 参考资料
95106

107+
. https://leetcode.cn/problems/word-break/solutions/2968135/jiao-ni-yi-bu-bu-si-kao-dpcong-ji-yi-hua-chrs/[139. 单词拆分 - 教你一步步思考 DP:从记忆化搜索到递推,附题单!^]
96108
. https://leetcode.cn/problems/word-break/solutions/302779/shou-hui-tu-jie-san-chong-fang-fa-dfs-bfs-dong-tai/[139. 单词拆分 - 「手画图解」剖析三种解法: DFS, BFS, 动态规划^] -- 这个题解非常好,从回溯,到加备忘录
97-
. https://leetcode.cn/problems/word-break/solutions/50986/dong-tai-gui-hua-ji-yi-hua-hui-su-zhu-xing-jie-shi/[139. 单词拆分 - 动态规划+记忆化回溯 逐行解释 Python3^]
109+
. https://leetcode.cn/problems/word-break/solutions/50986/dong-tai-gui-hua-ji-yi-hua-hui-su-zhu-xing-jie-shi/[139. 单词拆分 - 动态规划+记忆化回溯 逐行解释^]
110+
. https://leetcode.cn/problems/word-break/solutions/850456/dai-ma-sui-xiang-lu-139-dan-ci-chai-fen-50a1a/[139. 单词拆分 - 带你学透完全背包!^]

docs/0141-linked-list-cycle.adoc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[#0141-linked-list-cycle]
22
= 141. 环形链表
33

4-
https://leetcode.cn/problems/linked-list-cycle/[LeetCode - 141. 环形链表 ^]
4+
https://leetcode.cn/problems/linked-list-cycle/[LeetCode - 141. 环形链表^]
55

66
给你一个链表的头节点 `head` ,判断链表中是否有环。
77

@@ -97,8 +97,9 @@ include::{sourcedir}/_0141_LinkedListCycle_3.java[tag=answer]
9797

9898
== 参考资料
9999

100-
. https://leetcode.cn/problems/linked-list-cycle/solutions/440042/huan-xing-lian-biao-by-leetcode-solution/[141. 环形链表 - 官方题解^]
100+
. https://leetcode.cn/problems/linked-list-cycle/solutions/1999269/mei-xiang-ming-bai-yi-ge-shi-pin-jiang-t-c4sw/[141. 环形链表 - 没想明白?一个视频讲透快慢指针!^]
101101
. https://leetcode.cn/problems/linked-list-cycle/solutions/175734/yi-wen-gao-ding-chang-jian-de-lian-biao-wen-ti-h-2/[141. 环形链表 - 一文搞定常见的链表问题^]
102-
102+
. https://leetcode.cn/problems/linked-list-cycle/solutions/440042/huan-xing-lian-biao-by-leetcode-solution/[141. 环形链表 - 官方题解^]
103+
. https://leetcode.cn/problems/linked-list-cycle/solutions/438358/3chong-jie-jue-fang-shi-liang-chong-ji-bai-liao-10/[141. 环形链表 - 9种解决方式,8种击败了100%的用户^]
103104

104105

docs/0142-linked-list-cycle-ii.adoc

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,7 @@ include::{sourcedir}/_0142_LinkedListCycleII_4.java[tag=answer]
139139

140140
== 参考资料
141141

142-
. https://en.wikipedia.org/wiki/Cycle_detection[Cycle detection - Wikipedia^]
143-
. https://leetcode.cn/problems/linked-list-cycle-ii/solutions/441131/huan-xing-lian-biao-ii-by-leetcode-solution/[142. 环形链表 II - 官方题解^]
142+
. https://leetcode.cn/problems/linked-list-cycle-ii/solutions/1999271/mei-xiang-ming-bai-yi-ge-shi-pin-jiang-t-nvsq/[142. 环形链表 II - 【图解】一张图秒懂环形链表 II,Floyd 判圈算法^]
144143
. https://leetcode.cn/problems/linked-list-cycle-ii/solutions/12616/linked-list-cycle-ii-kuai-man-zhi-zhen-shuang-zhi-/[142. 环形链表 II - 双指针,清晰图解^]
145-
146-
144+
. https://leetcode.cn/problems/linked-list-cycle-ii/solutions/441131/huan-xing-lian-biao-ii-by-leetcode-solution/[142. 环形链表 II - 官方题解^]
145+
. https://en.wikipedia.org/wiki/Cycle_detection[Cycle detection - Wikipedia^]
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1844,6 +1844,11 @@ endif::[]
18441844
|{doc_base_url}/0146-lru-cache.adoc[题解]
18451845
|✅ 链表+哈希。
18461846

1847+
|{counter:codes2503}
1848+
|{leetcode_base_url}/word-break/[139. 单词拆分^]
1849+
|{doc_base_url}/0139-word-break.adoc[题解]
1850+
|✅ 动态规划。有两种思路:①向后看,从当前位置截取 `word` 长度的子串,判断子串和当前 `word` 是否相等以及之前的字符串是否可以可以拆分;②向前进,从零开始,根据当前 `word` 的长度,在同等长度子串相等的情况下,向前设置子串可以拆分,直到结尾。
1851+
18471852
|===
18481853

18491854
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.List;
4+
5+
public class _0139_WordBreak_3 {
6+
// tag::answer[]
7+
8+
/**
9+
* @author D瓜哥 · https://www.diguage.com
10+
* @since 2025-11-05 21:17:21
11+
*/
12+
public boolean wordBreak(String s, List<String> wordDict) {
13+
boolean[] dp = new boolean[s.length() + 1];
14+
dp[0] = true;
15+
for (int i = 1; i <= s.length(); i++) {
16+
for (String word : wordDict) {
17+
if (i < word.length()) {
18+
continue;
19+
}
20+
dp[i] = dp[i - word.length()]
21+
&& word.equals(s.substring(i - word.length(), i));
22+
if (dp[i]) {
23+
break;
24+
}
25+
}
26+
}
27+
return dp[s.length()];
28+
}
29+
// end::answer[]
30+
31+
static void main() {
32+
new _0139_WordBreak_3()
33+
.wordBreak("leetcode", List.of("leet", "code"));
34+
}
35+
}

0 commit comments

Comments
 (0)