核心思路
dp[i]表示:字符串前 i 个字符能不能被字典里的单词拼出来- 我们要算的就是
dp[s.length()]
转移方程
如果存在一个位置 j,满足:
dp[j] = true(前 j 个字符能拼出来)s[j ... i-1]这个子串在字典里那么:dp[i] = true
通俗解释
- 把字典放进
Set方便快速查找 dp[0] = true:空字符串默认是合法的- 对每个位置
i,往前看所有j- 如果前面
j是通的 - 并且
j 到 i这一段正好是一个单词 - 那
i也是通的
- 如果前面
- 最后看整个字符串
dp[n]是不是通的
完整代码实现:
java
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Set<String> set = new HashSet<>(wordDict);
int n = s.length();
boolean[] dp = new boolean[n + 1];
dp[0] = true;// 前0个字符 空串 是可以拼出来的
for(int i = 1;i<=n;i++){
for(int j = 0;j<i;j++){
// 前j个可以拼 并且j~i这段是单词
if(dp[j] && set.contains(s.substring(j,i))){
dp[i] = true;
break;
}
}
}
return dp[n];
}
}