问题描述
问题链接:https://leetcode-cn.com/problems/word-break/
分析
这道题可以采用动态规划来解决。
- 问题:单词是否可以成功分割
- 子问题:单词前几个字符是否可以成功分割
- 状态F(i):单词前i个字符是否可以成功分割
- 转移方程:这里的转移方程就不是等式了,而是搜索。
第一步:先判断i之前是否有F(j)=true,如果没有直接返回false,如果有的话继续
第二步:再在 j+1到i区间内查找是否有字典里包含的单词,如果有返回true,如果没有返回false,
-
所以转移方程为 F(i):j< i && F(j) &&在[j+1.i]是否可以在词典中找到(j=0时判断的是整个字符串在字典中是否存在)
-
初态F(0)=true (但F(0)没有实际意义,只是用来判断的,且必须为true)
-
返回值:F(s.length())
可以结合图片来看看
AC代码
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
if(s.length()==0)
{
return false;
}
boolean[] F=new boolean[s.length()+1];
F[0]=true;
for(int i=1;i<=s.length();i++)
{
for(int j=i-1;j>=0;j--)
{
//substring左开右闭(] 所以真实取值为j+1到i
if(F[j]&&wordDict.contains(s.substring(j,i)))
{
F[i]=true;
break;
}
}
}
return F[s.length()];
}
}