动态规划

单词拆分

中等#139Java时间 O(n × 字典大小 × 最长单词长度)空间 O(n)

题目要做什么

判断字符串 s 能否分割为字典中的若干非空单词。字典中的单词可以重复使用。

题目示例输入s = "leetcode", wordDict = ["leet","code"]
题目示例输出true

01 为什么这样做

dp[end] 表示前 end 个字符能否成功拆分。如果某个可拆分前缀 start 后面恰好跟着字典单词,就标记新的前缀为可拆分。

始终成立的条件

dp[0] 为 true,dp[end] 只会由已确定可拆分的更短前缀转移而来。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public boolean wordBreak(String s, List<String> wordDict) {3        boolean[] dp = new boolean[s.length() + 1];4        dp[0] = true;5        for (int start = 0; start < s.length(); start++) {6            if (!dp[start]) continue;7            for (String word : wordDict) {8                if (s.startsWith(word, start)) {9                    dp[start + word.length()] = true;10                }11            }12        }13        return dp[s.length()];14    }15}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索