Leetcode 139 单词拆分 JAVA

最能想到的是暴力的方法。 动态规划在这里是最有效果的解法。

时间复杂度为 O( n )。

n = 0 的时候, f 为 true。

n = 1 的时候, 只需要判断第一个字母是否在字典里。设置一个结果为 true。

n = 2 的时候, 需要判断 0 - 1 个字母,也就是 f(1) 是否为 true, 其次还要判断第二个字母是否在字典。

 

推广到 第 j 个字母的时候,0 - j 个字母,也就是 f ( j )是否为 true,这是第一个条件。第二个条件是:i - j 这个串是否在字典中,如果在字典中,那么 f ( i )就为 true。

否则为 false。

 

最后结果是 f ( len )的 Boolean 值。

 

 

这里还有两个知识点

1.list 集合里面有一个函数 contains ( a )。如果元素 a 在list 这个集合中,返回值为 true ,不在的话返回值就为 false。

2.string里面有一个函数,substring(i, j),将串里面从 i 到 j 的序列拿出来,作为返回值。

 

代码:

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int len = s.length();
        boolean []dp = new boolean[len+1];
        dp[0] = true;
        for(int i = 1; i <= len; i++)
            for(int j = 0; j < i; j++){
                if(dp[j] && wordDict.contains(s.subSequence(j,i))){
                    dp[i] = true;
                    break;
                }
                    
            }
        return dp[len];
    }
}

 

posted @ 2019-09-18 18:17  stul  阅读(251)  评论(0编辑  收藏  举报