File tree Expand file tree Collapse file tree 2 files changed +63
-0
lines changed Expand file tree Collapse file tree 2 files changed +63
-0
lines changed Original file line number Diff line number Diff line change 35
35
130. 被围绕的区域
36
36
131. 分割回文串
37
37
136. 只出现一次的数字
38
+ 139. 单词拆分
38
39
141. 环形链表
39
40
144. 二叉树的前序遍历
40
41
145. 二叉树的后序遍历
Original file line number Diff line number Diff line change
1
+ // 139. 单词拆分
2
+
3
+
4
+ /*
5
+ 动态规划:
6
+ 1、dp[i]表示前i个字符是否能由单词拼出
7
+ 2、初始化:dp[0] = true,方便递推判断
8
+ 3、状态转移方程:dp[i] = dp[j] && wordDict.contains(s.substring(j, i))
9
+ 4、遍历顺序:固定未知位置,由前面已知推断当前结果。固定第i个字符的位置,然后从头开始遍历到i位置,判断s[0,j)和s[j,i)是否能由单词拼出
10
+ 5、当dp[i]找到一个成功结果时就可以结束循环了
11
+ 6、i、j的使用:两个for循环中i、j是用于遍历dp数组的,表示dp数组的索引,dp数组的长度比字符串s 大1,用于初始化,字符串s要用i、j时需要根据情况转换成s对应的索引
12
+
13
+ dp □□□□□□
14
+ 索引 012345
15
+ s apple
16
+ 索引 01234
17
+ 位置 12345
18
+ */
19
+ class Solution {
20
+ public boolean wordBreak (String s , List <String > wordDict ) {
21
+ int n = s .length ();
22
+ boolean [] dp = new boolean [n + 1 ];
23
+ dp [0 ] = true ;
24
+ for (int i = 1 ; i <= n ; i ++) {
25
+ for (int j = 0 ; j < i ; j ++) {
26
+ if (dp [j ] && wordDict .contains (s .substring (j , i ))) {
27
+ dp [i ] = true ;
28
+ break ;
29
+ }
30
+ }
31
+ }
32
+ return dp [n ];
33
+ }
34
+ }
35
+
36
+
37
+ /*
38
+ 动态规划:
39
+ 1、dp[i]表示前i个字符是否能由单词拼出
40
+ 2、初始化:dp[0] = true,方便递推判断
41
+ 3、状态转移方程:dp[m] = dp[i] && m <= n && s.startsWith(word, i)
42
+ 4、遍历顺序:固定已知位置,推断后面位置结果。固定第i个字符的位置,且该位置能由单词拼出,然后遍历单词数组,判断扩增一个单词长度的子串是否为s的子串,是则该子串能由单词拼出
43
+ */
44
+ class Solution {
45
+ public boolean wordBreak (String s , List <String > wordDict ) {
46
+ int n = s .length ();
47
+ boolean [] dp = new boolean [n + 1 ];
48
+ dp [0 ] = true ;
49
+ for (int i = 0 ; i < n ; i ++) {
50
+ if (!dp [i ]) {
51
+ continue ;
52
+ }
53
+ for (String word : wordDict ) {
54
+ int m = i + word .length ();
55
+ if (m <= n && s .startsWith (word , i )) {
56
+ dp [m ] = true ;
57
+ }
58
+ }
59
+ }
60
+ return dp [n ];
61
+ }
62
+ }
You can’t perform that action at this time.
0 commit comments