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]; } }