这个问题可以用 动态规划 来解决。我们定义一个布尔数组 dp,其中 dp[i] 表示字符串前 i 个字符是否可以用字典中的单词拆分。
- 初始化:
dp[0] = true,因为空字符串可以被认为是可以拆分的。 - 状态转移方程:对于每个位置
i,我们检查从 0 到i的子字符串,如果某个子串s[j:i]在字典中且dp[j]为true,则dp[i] = true。
var wordBreak = function(s, wordDict) {
// 将 wordDict 转为 Set,便于查找
let wordSet = new Set(wordDict);
// 创建 dp 数组,长度为 s.length + 1,初始化为 false
let dp = new Array(s.length + 1).fill(false);
dp[0] = true; // 空字符串可以拆分
// 遍历字符串的每一个位置 i
for (let i = 1; i <= s.length; i++) {
// 对于每一个位置 i,遍历之前的所有位置 j
for (let j = 0; j < i; j++) {
// 如果 dp[j] 为 true 且 s[j:i] 在字典中,dp[i] 为 true
if (dp[j] && wordSet.has(s.slice(j, i))) {
dp[i] = true;
break; // 只要找到一种方式拆分就行
}
}
}
// 返回 dp[s.length],即整个字符串是否可以拆分
return dp[s.length];
};