面试:字符串: 提取单词(2)
2016-06-06 17:44
381 查看
题目
根据字典,从一个抹去空格的字符串里提取全部的单词组合,求单词组合里最大单词个数算法
一般求最大数量而不求具体方案,DPdp记录中间状态,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]; } }
相关文章推荐
- C#130问,初级程序员的面试宝典
- 面试:字符串:产生括号
- 剑指offer-面试题8:旋转数组中的最小数字
- 面试题:不用第三变量交换ab值
- 剑指Offer----面试题26:复杂链表的复制
- 面试中常见链表问题13:回文链表
- 链表面试题之合并有序的两个线性表-递归和非递归的方法
- 奋斗吧,程序员——第五十二章 我欲与君相知,长命无绝衰
- Java程序员必须掌握的排序算法Java实现整合二 :选择排序
- 面试中常见链表问题12:单链表反转(递归)
- 黑马程序员:为苹果与iOS开发者的前景正名
- 面试中常见链表问题11:在链表中删除给定元素值的节点
- 面试中常见链表问题10:交叉链表的第一个公共节点
- 黑马程序员:iOS开发行业为何“大不如前”
- 面试中常见链表问题9:对单链表进行插入排序
- 面试中常见链表问题8:重排链表
- 【LeetCode】Best Time to Buy and Sell Stock 程序员炒股 part.3
- 面试中常见链表问题7:反转链表2
- Java陷阱一箩筐----面试题集
- 程序员需要了解的东西-备