139. 单词拆分
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/word-break
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
// 单词就是物品,字符串s就是背包
HashSet<String> set = new HashSet<>(wordDict);
// dp[j],表示s[0,j]可以用字典中出现的单词拼接出
boolean [] dp = new boolean[s.length()+1];
// 初始化
dp[0] = true;
// 重复使用-> 完全背包
// 排列问题 -> 先遍历背包在遍历物品
// 遍历背包
for (int j = 1;j<=s.length();j++){
// 遍历物品,物品的下标最多到j
// 如果s[0,i]是能够被拼出的
// 并且s[i,j]是字典里的词组那么表明s[0,j]是能够被拼出的
// 而且要注意!dp[j]意味着s[0,j]如果之前的遍历就可以拼出那么直接跳过
for(int i=0;i<j&&!dp[j];i++){
if(set.contains(s.substring(i,j)) && dp[i]){
dp[j] = true;
}
}
}
return dp[s.length()];
}
}
背包问题总结篇!