题目:
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
For example, given
s = "leetcode"
,
dict = ["leet", "code"]
.
Return true because "leetcode"
can be segmented as "leet
code"
.
分析:
一开始看到这个题目,我的第一反应是要递归,但是之后感觉递归的做法估计没办法通过,然后就开始想,之后看到别人的思路之后,感觉其实还挺容易的。
解题思路:
一个字符串S,它的长度为N,如果S能够被“字典集合”(dict)中的单词拼接而成,那么所要满足的条件为:
F(0, N) = F(0, i) && F(i, j) && F(j, N);
这样子,如果我们想知道某个子串是否可由Dict中的几个单词拼接而成就可以用这样的方式得到结果(满足条件为True, 不满足条件为False)存入到一个boolean数组的对应位置上,这样子,最后boolean数组的最后一位就是F(0, N)的值,为True表示这个字符串S可由Dict中的单词拼接,否则不行!
话不多说,上AC代码!!
package cn.xym.leetcode; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Solution { /** * 方法二: */ public boolean wordBreak2(String s, Set<String> dict){ int len = s.length(); boolean[] arrays = new boolean[len+1]; arrays[0] = true; for (int i = 1; i <= len; ++i){ for (int j = 0; j < i; ++j){ if (arrays[j] && dict.contains(s.substring(j, i))){ // f(n) = f(0,i) + f(i,j) + f(j,n) arrays[i] = true; break; } } } return arrays[len]; } /* * 方法一: * */ public boolean wordBreak1(String s, Set<String> dict) { boolean flag = false; int strLen = s.length(); List<Integer> list = new ArrayList<Integer>(); for (int i=strLen-1; i>=0; --i){ String endSubStr = s.substring(i); if (dict.contains(endSubStr)){ list.add(i); }else{ for(Integer n : list){ if (dict.contains(s.substring(i,n))){ list.add(i); break; } } } } if (list.isEmpty()){ flag = false; }else{ Integer n = list.get(list.size() - 1); flag = n == 0 ? true : false; } return flag; } public static void main(String[] args) { String s = "leetcode"; Set<String> dict = new HashSet<String>(); dict.add("leet"); dict.add("code"); Solution solution = new Solution(); System.out.println(solution.wordBreak2(s, dict)); } }
leetCode解题报告之Word Break,布布扣,bubuko.com
原文:http://blog.csdn.net/ljphhj/article/details/21643391