法1:动态规划
想法:
- 字符串 s 是背包
- 单词列表 wordDict 中的单词是物品
- 物品可重复放入背包
- 数组dp:
- dp[i]表示:s 中以 s[0] 开头的 i 长度的子串 代表的 背包,是否可正好被单词装满
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boolean}
*/
var wordBreak = function(s, wordDict) {
// 字符串s是背包
// 单词列表wordDict中的单词是物品
// 物品可重复放入背包
// dp[i]表示:
// s中以s[0]开头的 i 长度的子串 代表的 背包,是否可正好被单词装满
var dp = [], i = 0, j = 0, exist = 0;
for(i = 0; i <= s.length; i++) {
dp[i] = false;
subs[i] = s.substr(0, i); // s中以s[0]开头,长度为i的子串
}
// 空字符串一定可以被单词装满
// 相当于不分割字符串
// 为协调全部分割状态,故采取dp[0]为true的形式
// 只要剩余字符串可以被装满,则两者相与为true,可被装满
dp[0] = true;
for(i = 1; i <= s.length; i++) {
// 对于各容量背包,即 s 中以s[0]开头的 i 长度的子串
for(j = 0; j < wordDict.length; j++) {
// 对于wordDict中每个单词
if(i <