字符串分割(Word Break)
动态规划——中等
给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。
例如:
给定s=“nowcode”;
dict=[“now”, “code”].
返回true,因为"nowcode"可以被分割成"now code".
状态分析:
子状态:前1,2,3,…,n个字符能否根据词典中的词被成功分词
dp[i] 以第i个字符结尾的单词序列是否能被分词
状态递推:
F(i): true{j <i && F(j) && substr[j+1,i]能在词典中找到} OR false
在j小于i中,只要能找到一个F(j)为true,并且从j+1到i之间的字符能在词典中找到,则F(i)为true
状态方程:dp[i] = true{j <i && F(j) && substr[j+1,i]能在词典中找到} OR false
dp[3] = dp[1] && substring(2,3)
dp[3] = dp[2] && substring(3,3)
初始值:dp[0] = true;
返回值:dp[i];
import java.util.*;
public class Solution {
public boolean wordBreak(String s, Set<String> dict) {
boolean[] dp = new boolean[s.length()+1];
dp[0] = true;
for(int i=1;i<=s.length();i++){
for(int j=i-1;j>=0;j--){
//substring [j,i);
if(dp[j] && dict.contains(s.substring(j,i))){
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}
动规一点也不难!!!?