139. 单词拆分 - 力扣(LeetCode)
1.确定dp数组以及下标的含义:dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。
2.确定递推公式:如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。
3.dp数组如何初始化:dp[0]一定要为true,否则递推下去后面都都是false了。
4.确定遍历顺序:外层for遍历背包,内层for循环遍历物品。
/**139. 单词拆分
* 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
* 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
* @param s
* @param wordDict
* @return
*/
public boolean wordBreak(String s, List<String> wordDict) {
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for (int i = 1; i <= s.length(); i++) {
for (String word : wordDict) {
int len = word.length();
if (i>=len && dp[i-len] && word.equals(s.substring(i-len,i))){
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}