139.单词拆分
关键点1:dp数组的含义:dp[s.length()] 表示背包容量为s.length时,是否可以组成字符串;
关键点2:遍历顺序:先遍历背包容量,再遍历物品,因为要重复使用元素,所以背包要正序遍历
关键点3:判断条件
dp[i - len] dp数组前i-len个都是true;
word.equals(s.substring(i - len, i)) 表示字典里的这个单词和字符串对应的i - len, i的字符相等
关键点4:递归公式,dp[i] = true;break;
关键点5:最终,返回 dp[s.length()]
class Solution {
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();// 字典中单词的数量
// dp[i - len] dp数组前i-len个都是true
// word.equals(s.substring(i - len, i))表示字典里的这个单词和字符串对应的i - len, i的字符相等
if (i >= len && dp[i - len] && word.equals(s.substring(i - len, i))) {
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}
}