leetcode之Word-break

来源:互联网 发布:php cli模式 编辑:程序博客网 时间:2024/06/09 15:38

题目

Word-break

Given a string s and a dictionary of wordsdict, determine if s can be segmented into a space-separated sequence of one ormore dictionary words.

For example, given

s ="leetcode",

dict =["leet", "code"].

Return true because"leetcode"canbe segmented as"leet code".

思路:

如果一个单词存在一种分解方法,分解后每一块都在字典中,那必定满足这么一个条件:对于该单词的最后一个分割点,这个分割点到单词末尾所组成的字符串是一个单词,而这个分割点到单词开头所组成的字符串也是可分解的。所以只要验证满足这个条件,我们则可以确定这个较长的字符串也是可分解的。

所以我们用外层循环来控制待验证的字符串的长度,而用内层的循环来寻找这么一个分割点,可以把字符串分成一个单词和一个同样可分解的子字符串。同时,我们用数组记录下字符串长度递增时可分解的情况,以供之后使用,避免重复计算。

解法:

动态规划

首先我们要决定要存储什么历史信息以及用什么数据结构来存储信息。然后是最重要的递推式,就是如从存储的历史信息中得到当前步的结果。最后我们需要考虑的就是起始条件的值。

接下来我们套用上面的思路来解这道题。首先我们要存储的历史信息res[i]是表示到字符串s的第i个元素为止能不能用字典中的词来表示,我们需要一个长度为n的布尔数组来存储信息。然后假设我们现在拥有res[0,...,i-1]的结果,我们来获得res[i]的表达式。思路是对于每个以i为结尾的子串,看看他是不是在字典里面以及他之前的元素对应的res[j]是不是true,如果都成立,那么res[i]true,写成式子是

http://img.blog.csdn.net/20140328035736484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluaHVhbm1hcnM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

时间复杂度:O(n^2)

空间复杂度:O(n)

具体代码:

public boolean wordBreak(String s,Set<String> dict) {

             if(s == null || s.length() == 0)

                    returntrue;

             boolean[]res = new boolean[s.length() + 1];

             res[0]= true;

             for(int i = 0; i < s.length(); i++) {

                    StringBuilderstr = new StringBuilder(s.substring(0, i + 1));

                    for(int j = 0; j <= i; j++) {

                           if(res[j] && dict.contains(str.toString())) {

                                  res[i+ 1] = true;

                                  break;

                           }

                           str.deleteCharAt(0);

                    }

             }

             returnres[s.length()];

      }


原创粉丝点击