9 动态规划解单次词拆分

描述:给定一个非空字符串和一个包含非空单次的列表wordDict,判定s是否可以被空格拆分成一个或多个在字典中出现的单词。

说明:
        1 拆分式可以重复使用字典中的单词。
        2 你可以假设字典中没有重复的单词。

示例1:
输入:
        s="leetcode"
        wordDict=["leet","code"]
输出true
解释:因为"leetcode"可以被拆分成"leet""code"

分析:这题让把字符串拆分成一些子串,并且判断这些子串是否在字典wordDict中,可以使用动态规划的方式进行解决,定义动态数组dp[i]:表示字符串前i个字符经过拆分是否存在于字典wordDict中,如果要求取dp[i],我们向前截取k个字符串,判断子串[i-k+1,i]是否存在于wordDict中,并且前面的[0,i-k]子串也是否存在于wordDict中;

//函数返回值是布尔类型,表征是否能被字典所拆分,参数是需要进行判断的String以及字典列表list
public Boolean stringPartition(String s,ListwordDict)
{
//定义Boolean类型的动态数组
Boolean dp[]=new Boolean[s.length()];
//首先进行动态数组进行初始化,即判断字典中是否存在第一个字母,由于substring取得是右开集,所以其取得是[0,1)也就是第一个字母
if(wordDict.contains(s.substring(0,1)))
{
dp[0]=true;
}else
{
dp[0]=false;
}
//进行动态数组的更新
for(int i=1;i1;j--)
{
if(wordDict.contains(s.substring(j))&&dp[j-1])
{
dp[i]=true;
continue;
}
//上面两个条件均不成立,表明dp[i]无法进行划分
dp[i]=false;
}

}
return dp[s.length()-1];
}

递归求解:

public Boolean stringPartition2(String s,ListwordDict,int index)
{
//表示到了最后一步了,前面已经成功了
if(index>=s.length())
{
return true;
}
Boolean flag=false;
//index之前已经可以构成子串,从index开始寻找
for(int i=index;i

你可能感兴趣的:(JAVA刷题500道,动态规划,算法,java)