Skip to content

Commit a7012fe

Browse files
committed
Create 139.单词拆分(中等).md
1 parent 04df8e1 commit a7012fe

1 file changed

Lines changed: 42 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
```text
2+
题目: 给定一个非空字符串s和一个包含非空单词列表的字典wordDict,判定s是否可以被空格拆分为一个或多个在字典中出现的单词;
3+
说明:
4+
拆分时可以重复使用字典中的单词
5+
可以假设字典中没有重复的单词
6+
示例 1:
7+
输入: s = "leetcode", wordDict = ["leet", "code"]
8+
输出: true
9+
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"
10+
1.动态规划:
11+
[1]思路:
12+
(1)定义dp[i]表示字符串s的前i个字符组成的字符串s[0..i?1]是否能拆分成若干个字典中出现的单词;
13+
(2)以分割点j来分割字符串s[0..i?1],即得s[0..j-1],s[j..i?1]
14+
(3)则当dp[j]为true(即字符串s[0..j-1]能拆分成若干个字典中出现的单词),且字符串s[j..i-1]是字典中出现的单词时,dp[i]=true
15+
(4)由上可得转移方程为: dp[i]=dp[j] && check(s[j..i?1]) (check(s[j..i?1])表示子串s[j..i-1]s[j..i?1]是否出现在字典中)
16+
[2]实现:
17+
class Solution {
18+
public boolean wordBreak(String s, List<String> wordDict) {
19+
// 使用字典集合构建哈希表
20+
Set<String> wordDictSet = new HashSet<>(wordDict);
21+
// 创建dp[i]
22+
boolean[] dp = new boolean[s.length()+1];
23+
// 添加边界条件(下标为0之前的字符串也即为空串)
24+
dp[0] = true;
25+
//遍历
26+
for (int i = 1; i <= s.length(); i++) {
27+
for (int j = 0; j < i; j++) {
28+
// 转移方程
29+
if(dp[j] && wordDictSet.contains(s.substring(j,i))){
30+
dp[i] = true;
31+
break;
32+
}
33+
}
34+
}
35+
// dp[s.length()]表示的是整个字符串s[0..s.length()]是否能拆分成若干个字典中出现的单词
36+
return dp[s.length()];
37+
}
38+
}
39+
[3]复杂度分析:
40+
(1)时间复杂度: O(N^2),N为字符串的长度
41+
(2)空间复杂度: O(N),N为字符串的长度,dp数组以及哈希表各需要O(n)的空间复杂度
42+
```

0 commit comments

Comments
 (0)