面试:字符串: 提取单词(2)

题目

根据字典,从一个抹去空格的字符串里提取全部的单词组合,求单词组合里最大单词个数

算法

  • 一般求最大数量而不求具体方案,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];
    }
    }
    原文作者:LandscapeMi
    原文地址: https://blog.csdn.net/mijian1207mijian/article/details/51597076
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞