题目
根据字典,从一个抹去空格的字符串里提取全部的单词组合,求单词组合里最大单词个数
算法
- 一般求最大数量而不求具体方案,DP
- dp记录中间状态,dp[i]代表从0到i的子串包含的最大数量,程序最后返回dp[n-1], n为字符串的长度,dp计算的等式为
- dp[j]=max(dp[j],dp[i]+1),从第i+1到第j个字符组成的字符串是一个单词
public class Solution{
public int segString(String s, HashSet<String> d){
if(s==null||s.length()==0)
return 0;
int[] dp=new int[s.length()]; //初始化为0
//记录从0带i的子串是否为字典里的单词
for(int i=0;i<s.length();i++){
String sub=s.substring(0,i+1);
if(d.contains(sub)){
dp[i]=1; //如果整个串是一个单词,则加1
}
}
for(int i=0;i<s.length()-1;i++){
for(int j=i+1;j<s.length();j++){
if(dp[i]>0){
//如果i之前的能分割成单词
//那么考虑i+1到j的情况
String sub=s.substring(i+1,j+1);
if(d.contains(sub)){
//如果i+1到j也是一个单词
//那么更新从i到j的最大单词数
dp[j]=Math.max(dp[j], dp[i]+1);
}
}
}
}
return dp[s.length()-1];
}
}