题目链接
https://leetcode.cn/problems/word-break/?envType=study-plan-v2&envId=top-100-liked
思路
动态规划,dp[i]表示前i个位置是否可以被正常划分
初始化的话我们只需要把dp[0] = true,因为空字符串天然不需要划分
关于动态规划部分,我们主要是需要考虑:
- 前面的位置是否可以正常划分,即要找到前面的分割点
- 切割点到当前位置[即最后一刀]这个位置是否合法
如果能找到切点且当前位置也合法,那么就说明当前位置可以作为一个切点,因此dp[i] = true
代码
java
class Solution {
//动态规划: dp[i]表示前i个字符是否可以被成功划分
public boolean wordBreak(String s, List<String> wordDict) {
HashSet<String> set = new HashSet<>(wordDict);
int n = s.length();
boolean[] dp = new boolean[n + 1];
dp[0] = true;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= i; j++) {
//前j个字符可以找到切点且最后一刀分割出来的字符串也在字典里,即合法
if(dp[j] && set.contains(s.substring(j, i))) {
dp[i] = true;
break;
}
}
return dp[n];
}
}