File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ ```
You can’t perform that action at this time.
0 commit comments